Πράξεις συνόλων (π.χ. προσδιορισμός συνόλων ένωσης, συνόλων προϊόντων και υποσυνόλων) με τον τύπο συνόλων της Python

Επιχείρηση

Η Python παρέχει έναν ενσωματωμένο τύπο δεδομένων, το set, ο οποίος χειρίζεται σύνολα.

Το σύνολο τύπου είναι μια συλλογή μη διπλών στοιχείων (στοιχεία που δεν έχουν την ίδια τιμή, μοναδικά στοιχεία) και μπορεί να εκτελέσει πράξεις συνόλου, όπως το σύνολο ένωσης, το σύνολο προϊόντος και το σύνολο διαφοράς.

Σε αυτή την ενότητα, εξηγούνται οι βασικές λειτουργίες στις λειτουργίες συνόλων τύπου set με δείγμα κώδικα.

  • Δημιουργία αντικειμένων συνόλου: {},set()
  • συμβολισμός συμπερίληψης συνόλου
  • Αριθμός στοιχείων στο σύνολο:len()
  • Προσθήκη στοιχείου σε σύνολο:add()
  • Αφαίρεση ενός στοιχείου από ένα σύνολο: discard(),remove(),pop(),clear()
  • Wasset (συγχώνευση, ένωση):|operator,union()
  • Σύνολα προϊόντων (κοινά μέρη, διασταυρώσεις, διασταυρώσεις):& χειριστής,intersection()
  • σχετικό συμπλήρωμα:-χειριστής,difference()
  • σύνολο διαφορών συμμετρίας:^ χειριστής,symmetric_difference()
  • υποσύνολο ή όχι:<= τελεστής,issubset()
  • Ανώτερο σύνολο ή όχι:>= τελεστής,issuperset()
  • Προσδιορισμός του κατά πόσον είναι αμοιβαία πρωτεύοντα ή όχι:isdisjoint()

Ο τύπος set είναι ένας μεταβλητός τύπος που μπορεί να προσθέτει και να διαγράφει στοιχεία και υπάρχει επίσης ένας τύπος frozenset που έχει την ίδια λειτουργία set και άλλες μεθόδους με τον τύπο set αλλά είναι αμετάβλητος (δεν μπορεί να τροποποιηθεί με προσθήκη, διαγραφή ή άλλη τροποποίηση στοιχείων).

Δημιουργία αντικειμένου συνόλου:: {}, set()

Παράγεται από κυματικές αγκύλες {}

Αντικείμενα τύπου set μπορούν να δημιουργηθούν περικλείοντας στοιχεία σε αγκύλες {}.

Εάν υπάρχουν διπλές τιμές, αγνοούνται και μόνο οι μοναδικές τιμές παραμένουν ως στοιχεία.

s = {1, 2, 2, 3, 1, 4}

print(s)
print(type(s))
# {1, 2, 3, 4}
# <class 'set'>

Είναι δυνατόν να έχετε διαφορετικούς τύπους ως στοιχεία. Ωστόσο, δεν μπορούν να καταχωρηθούν αντικείμενα με δυνατότητα ενημέρωσης, όπως οι τύποι λίστας. Επιτρέπονται οι πλειάδες.

Επίσης, δεδομένου ότι οι τύποι συνόλων είναι μη ταξινομημένοι, η σειρά με την οποία δημιουργούνται δεν αποθηκεύεται.

s = {1.23, 'abc', (0, 1, 2), 'abc'}

print(s)
# {(0, 1, 2), 1.23, 'abc'}

# s = {[0, 1, 2]}
# TypeError: unhashable type: 'list'

Διαφορετικοί τύποι, όπως int και float, θεωρούνται διπλότυποι εάν οι τιμές τους είναι ισοδύναμες.

s = {100, 100.0}

print(s)
# {100}

Δεδομένου ότι μια κενή παρένθεση {} θεωρείται τύπος λεξικού, ένα αντικείμενο τύπου κενό σύνολο (empty set) μπορεί να δημιουργηθεί χρησιμοποιώντας τον κατασκευαστή που περιγράφεται στη συνέχεια.

s = {}

print(s)
print(type(s))
# {}
# <class 'dict'>

Παράγεται από τον κατασκευαστή set()

Αντικείμενα τύπου set μπορούν επίσης να δημιουργηθούν με τον κατασκευαστή set().

Ο προσδιορισμός ενός επαναλήψιμου αντικειμένου, όπως μια λίστα ή μια πλειάδα, ως όρισμα παράγει ένα αντικείμενο συνόλου του οποίου τα στοιχεία είναι μόνο μοναδικές τιμές, με εξαίρεση τα διπλά στοιχεία.

l = [1, 2, 2, 3, 1, 4]

print(l)
print(type(l))
# [1, 2, 2, 3, 1, 4]
# <class 'list'>

s_l = set(l)

print(s_l)
print(type(s_l))
# {1, 2, 3, 4}
# <class 'set'>

Οι αμετάβλητοι τύποι frozenset δημιουργούνται με τον κατασκευαστή frozenset().

fs_l = frozenset(l)

print(fs_l)
print(type(fs_l))
# frozenset({1, 2, 3, 4})
# <class 'frozenset'>

Εάν το όρισμα παραλειφθεί, δημιουργείται ένα κενό αντικείμενο τύπου συνόλου (κενό σύνολο).

s = set()

print(s)
print(type(s))
# set()
# <class 'set'>

Τα διπλά στοιχεία μπορούν να αφαιρεθούν από μια λίστα ή πλειάδα με τη χρήση της set(), αλλά η σειρά της αρχικής λίστας δεν διατηρείται.

Για να μετατρέψετε έναν τύπο συνόλου σε λίστα ή πλειάδα, χρησιμοποιήστε list(),tuple().

l = [2, 2, 3, 1, 3, 4]

l_unique = list(set(l))
print(l_unique)
# [1, 2, 3, 4]

Ανατρέξτε στο ακόλουθο άρθρο για πληροφορίες σχετικά με την αφαίρεση διπλών στοιχείων διατηρώντας τη σειρά, την εξαγωγή μόνο διπλών στοιχείων και την επεξεργασία διπλών στοιχείων σε δισδιάστατο πίνακα (λίστα λιστών).

συμβολισμός συμπερίληψης συνόλου

Εκτός από τις κατανοήσεις λίστας, υπάρχουν και οι κατανοήσεις συνόλων. Απλά αντικαταστήστε τις αγκύλες [] με αγκύλες {} στις κατανοήσεις λίστας.

s = {i**2 for i in range(5)}

print(s)
# {0, 1, 4, 9, 16}

Ανατρέξτε στο ακόλουθο άρθρο για περισσότερες πληροφορίες σχετικά με τη σημειογραφία κατανόησης λίστας.

Αριθμός στοιχείων στο σύνολο: len()

Ο αριθμός των στοιχείων ενός συνόλου μπορεί να ληφθεί με την ενσωματωμένη συνάρτηση len().

s = {1, 2, 2, 3, 1, 4}

print(s)
print(len(s))
# {1, 2, 3, 4}
# 4

Αν θέλετε να μετρήσετε τον αριθμό των στοιχείων κάθε λίστας που έχει στοιχεία με διπλές τιμές κ.λπ., ανατρέξτε στο ακόλουθο άρθρο.

Προσθήκη στοιχείου σε σύνολο: add()

Για να προσθέσετε ένα στοιχείο σε ένα σύνολο, χρησιμοποιήστε τη μέθοδο add().

s = {0, 1, 2}

s.add(3)
print(s)
# {0, 1, 2, 3}

Αφαίρεση ενός στοιχείου από ένα σύνολο: discard(),remove(),pop(),clear()

Για να αφαιρέσετε ένα στοιχείο από ένα σύνολο, χρησιμοποιήστε τις μεθόδους discard(), remove(), pop() και clear().

Η μέθοδος discard() διαγράφει το στοιχείο που καθορίζεται στο όρισμα. Εάν καθοριστεί μια τιμή που δεν υπάρχει στο σύνολο, δεν γίνεται τίποτα.

s = {0, 1, 2}

s.discard(1)
print(s)
# {0, 2}

s = {0, 1, 2}

s.discard(10)
print(s)
# {0, 1, 2}

Η μέθοδος remove() αφαιρεί επίσης το στοιχείο που καθορίζεται στο όρισμα, αλλά επιστρέφεται ένα σφάλμα KeyError εάν καθοριστεί μια τιμή που δεν υπάρχει στο σύνολο.

s = {0, 1, 2}

s.remove(1)
print(s)
# {0, 2}

# s = {0, 1, 2}

# s.remove(10)
# KeyError: 10

Η μέθοδος pop() αφαιρεί στοιχεία από ένα σύνολο και επιστρέφει τις τιμές τους. Δεν είναι δυνατή η επιλογή των τιμών που θα αφαιρεθούν. Ένα άδειο σύνολο θα οδηγήσει σε σφάλμα KeyError.

s = {2, 1, 0}

v = s.pop()

print(s)
print(v)
# {1, 2}
# 0

s = {2, 1, 0}

print(s.pop())
# 0

print(s.pop())
# 1

print(s.pop())
# 2

# print(s.pop())
# KeyError: 'pop from an empty set'

Η μέθοδος clear() αφαιρεί όλα τα στοιχεία και καθιστά το σύνολο κενό.

s = {0, 1, 2}

s.clear()
print(s)
# set()

Wasset (συγχώνευση, ένωση): |operator, union()

Το σύνολο ένωσης (merger, union) μπορεί να ληφθεί με τον τελεστή | ή τη μέθοδο union().

s1 = {0, 1, 2}
s2 = {1, 2, 3}
s3 = {2, 3, 4}

s_union = s1 | s2
print(s_union)
# {0, 1, 2, 3}

s_union = s1.union(s2)
print(s_union)
# {0, 1, 2, 3}

Μπορούν να καθοριστούν πολλαπλά ορίσματα για μια μέθοδο. Εκτός από τον τύπο set, ως ορίσματα μπορούν επίσης να καθοριστούν λίστες και πλειάδες που μπορούν να μετατραπούν στον τύπο set με τη set(). Το ίδιο ισχύει και για τους επόμενους τελεστές και τις μεθόδους.

s_union = s1.union(s2, s3)
print(s_union)
# {0, 1, 2, 3, 4}

s_union = s1.union(s2, [5, 6, 5, 7, 5])
print(s_union)
# {0, 1, 2, 3, 5, 6, 7}

Σύνολα προϊόντων (κοινά μέρη, διασταυρώσεις, διασταυρώσεις): & χειριστής, intersection()

Το σύνολο προϊόντων (κοινό μέρος, τομή και τομή) μπορεί να ληφθεί με τον τελεστή & ή τη μέθοδο intersection().

s_intersection = s1 & s2
print(s_intersection)
# {1, 2}

s_intersection = s1.intersection(s2)
print(s_intersection)
# {1, 2}

s_intersection = s1.intersection(s2, s3)
print(s_intersection)
# {2}

σχετικό συμπλήρωμα: -χειριστής, difference()

Το σύνολο των διαφορών μπορεί να ληφθεί με τον τελεστή – ή τη μέθοδο difference().

s_difference = s1 - s2
print(s_difference)
# {0}

s_difference = s1.difference(s2)
print(s_difference)
# {0}

s_difference = s1.difference(s2, s3)
print(s_difference)
# {0}

σύνολο διαφορών συμμετρίας: ^ χειριστής, symmetric_difference()

Το σύνολο της συμμετρικής διαφοράς (το σύνολο των στοιχείων που περιέχονται σε ένα μόνο από τα δύο) μπορεί να ληφθεί με τον τελεστή ^ ή την symmetric_difference().

Ισοδύναμο με την αποκλειστική διάζευξη (XOR) στις λογικές πράξεις.

s_symmetric_difference = s1 ^ s2
print(s_symmetric_difference)
# {0, 3}

s_symmetric_difference = s1.symmetric_difference(s2)
print(s_symmetric_difference)
# {0, 3}

υποσύνολο ή όχι: <= τελεστής, issubset()

Για να προσδιορίσετε αν ένα σύνολο είναι υποσύνολο ενός άλλου συνόλου, χρησιμοποιήστε τον τελεστή <= ή τη μέθοδο issubset().

s1 = {0, 1}
s2 = {0, 1, 2, 3}

print(s1 <= s2)
# True

print(s1.issubset(s2))
# True

Τόσο ο τελεστής <= όσο και η μέθοδος issubset() επιστρέφουν true για ισοδύναμα σύνολα.

Για να προσδιορίσετε αν είναι αληθές υποσύνολο, χρησιμοποιήστε τον τελεστή <=, ο οποίος επιστρέφει ψευδές για ισοδύναμα σύνολα.

print(s1 <= s1)
# True

print(s1.issubset(s1))
# True

print(s1 < s1)
# False

Ανώτερο σύνολο ή όχι: >= τελεστής, issuperset()

Για να προσδιορίσετε αν ένα σύνολο είναι υπερσύνολο ενός άλλου, χρησιμοποιήστε τον τελεστή >= ή την issuperset().

s1 = {0, 1}
s2 = {0, 1, 2, 3}

print(s2 >= s1)
# True

print(s2.issuperset(s1))
# True

Τόσο ο τελεστής >= όσο και η μέθοδος issuperset() επιστρέφουν true για ισοδύναμα σύνολα.

Για να προσδιορίσετε αν είναι αληθές υπερσύνολο, χρησιμοποιήστε τον τελεστή >=, ο οποίος επιστρέφει ψευδές για ισοδύναμα σύνολα.

print(s1 >= s1)
# True

print(s1.issuperset(s1))
# True

print(s1 > s1)
# False

Προσδιορισμός του κατά πόσον είναι αμοιβαία πρωτεύοντα ή όχι: isdisjoint()

Για να προσδιορίσετε αν δύο σύνολα είναι πρωτεύοντα μεταξύ τους, χρησιμοποιήστε τη μέθοδο isdisjoint().

s1 = {0, 1}
s2 = {1, 2}
s3 = {2, 3}

print(s1.isdisjoint(s2))
# False

print(s1.isdisjoint(s3))
# True
Copied title and URL