Ακολουθεί μια περιγραφή του τρόπου με τον οποίο μπορείτε να προσδιορίσετε αν μια λίστα (πίνακας) έχει διπλά στοιχεία (όλα τα στοιχεία είναι μοναδικά\μοναδικά) στην Python, για κάθε μια από τις ακόλουθες περιπτώσεις.
- Για μια λίστα χωρίς λίστα στο στοιχείο
- Για λίστες με λίστες στοιχείων (δισδιάστατοι πίνακες, λίστες λιστών κ.λπ.)
Ανατρέξτε στο ακόλουθο άρθρο σχετικά με τον τρόπο αφαίρεσης ή εξαγωγής διπλών στοιχείων από μια λίστα.
Σημειώστε ότι οι λίστες μπορούν να αποθηκεύουν διαφορετικούς τύπους δεδομένων και διαφέρουν αυστηρά από τους πίνακες. Αν θέλετε να χειρίζεστε πίνακες σε διαδικασίες που απαιτούν μέγεθος μνήμης και διευθύνσεις μνήμης ή αριθμητική επεξεργασία μεγάλων δεδομένων, χρησιμοποιήστε array (standard library) ή NumPy.
Προσδιορίστε αν υπάρχουν διπλά στοιχεία στη λίστα (αν το στοιχείο δεν έχει λίστα)
Εάν το στοιχείο δεν έχει ένα αντικείμενο με δυνατότητα ενημέρωσης, όπως μια λίστα, χρησιμοποιήστε τον κατασκευαστή set() του τύπου set set.
Ο τύπος συνόλου είναι ένας τύπος δεδομένων που δεν έχει διπλά στοιχεία. Όταν μια λίστα περνάει στον κατασκευαστή set(), οι διπλές τιμές αγνοούνται και επιστρέφεται ένα αντικείμενο τύπου set με μοναδικές τιμές ως στοιχεία.
Ο αριθμός των στοιχείων αυτού του αντικειμένου τύπου συνόλου και της αρχικής λίστας λαμβάνεται και συγκρίνεται με τη χρήση της ενσωματωμένης συνάρτησης len().
- Εάν ο αριθμός των στοιχείων είναι ίσος, δεν υπάρχουν διπλά στοιχεία στην αρχική λίστα.
- Τα διπλά στοιχεία περιλαμβάνονται στην αρχική λίστα εάν ο αριθμός των στοιχείων είναι διαφορετικός.
Οι συναρτήσεις που επιστρέφουν false αν δεν υπάρχουν διπλά στοιχεία και true αν υπάρχουν διπλά στοιχεία είναι οι εξής
def has_duplicates(seq):
return len(seq) != len(set(seq))
l = [0, 1, 2]
print(has_duplicates(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates(l))
# True
Το παράδειγμα είναι μια λίστα, αλλά η ίδια συνάρτηση μπορεί να χρησιμοποιηθεί με πλειάδες.
Τα μεταβλητά (ανανεώσιμα) αντικείμενα, όπως οι λίστες, δεν μπορούν να είναι στοιχεία τύπου set. Επομένως, οι λίστες με λίστες ως στοιχεία (δισδιάστατοι πίνακες, λίστες λιστών κ.λπ.) θα οδηγήσουν σε TypeError. Το αντίμετρο παρουσιάζεται παρακάτω.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Προσδιορίστε αν υπάρχουν διπλά στοιχεία στη λίστα (αν το στοιχείο έχει λίστα)
Στην περίπτωση μιας λίστας με μια λίστα στοιχείων (όπως μια λίστα από λίστες), οι ακόλουθες συναρτήσεις μπορούν να χρησιμοποιηθούν για να προσδιοριστεί αν υπάρχουν διπλά στοιχεία.
def has_duplicates2(seq):
seen = []
unique_list = [x for x in seq if x not in seen and not seen.append(x)]
return len(seq) != len(unique_list)
l_2d = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(l_2d))
# False
l_2d = [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(l_2d))
# True
Αντί της set(), ο συμβολισμός κατανόησης λίστας παράγει μια λίστα της οποίας τα στοιχεία είναι μόνο μοναδικές τιμές και ο αριθμός των στοιχείων συγκρίνεται. Δείτε το ακόλουθο άρθρο για λεπτομέρειες.
Η συνάρτηση αυτή ισχύει επίσης για λίστες που δεν έχουν λίστα στοιχείων.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Το παράδειγμα μέχρι στιγμής είναι ο προσδιορισμός του κατά πόσον η λίστα των στοιχείων είναι διπλή (περιέχει την ίδια λίστα).
Το αν τα στοιχεία κάθε λίστας επικαλύπτονται μπορεί να προσδιοριστεί μετά την ισοπέδωση της αρχικής λίστας σε μία διάσταση.
l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]
print(has_duplicates(sum(l_2d, [])))
# False
l_2d = [[0, 1], [2, 0]]
print(has_duplicates(sum(l_2d, [])))
# True
Εδώ, η sum() χρησιμοποιείται για την ισοπέδωση της λίστας, αλλά μπορεί επίσης να χρησιμοποιηθεί η itertools.chain.from_iterable(). Επιπλέον, κατά την ισοπέδωση μιας λίστας τριών ή περισσότερων διαστάσεων, είναι απαραίτητο να οριστεί μια νέα συνάρτηση.