5 Μέθοδοι για την κατάργηση διπλότυπων αντικειμένων από λίστες Python

Σε αυτό το σεμινάριο, θα μάθετε πώς να αφαιρείτε διπλότυπα στοιχεία από λίστες Python.

Όταν εργάζεστε με λίστες στην Python, μερικές φορές μπορεί να χρειαστεί να εργαστείτε μόνο με μοναδικά στοιχεία στη λίστα – αφαιρώντας τα διπλότυπα.

Υπάρχουν μερικοί διαφορετικοί τρόποι με τους οποίους μπορείτε να το κάνετε αυτό. Σε αυτό το σεμινάριο, θα δούμε πέντε τέτοιες τεχνικές.

Βασικά στοιχεία των λιστών Python

Ας ξεκινήσουμε τη συζήτησή μας αναθεωρώντας τα βασικά των λιστών Python.

Οι λίστες Python είναι ευμετάβλητος. Έτσι, μπορείτε να τα τροποποιήσετε στη θέση τους προσθέτοντας και αφαιρώντας στοιχεία από τη λίστα. Επιπλέον, οι λίστες Python είναι συλλογές στοιχείων που δεν είναι απαραίτητα μοναδικά.

Πώς λοιπόν διατηρείτε μόνο τα μοναδικά στοιχεία και αφαιρείτε τα διπλά ή επαναλαμβανόμενα στοιχεία;

Λοιπόν, μπορείτε να το κάνετε αυτό με μερικούς διαφορετικούς τρόπους. Μπορείτε είτε να δημιουργήσετε μια νέα λίστα που περιέχει μόνο τα μοναδικά στοιχεία της αρχικής λίστας. Ή μπορείτε να επιλέξετε να τροποποιήσετε την αρχική λίστα και να αφαιρέσετε τα διπλότυπα στοιχεία.

Θα τα μάθουμε λεπτομερώς σε αυτό το σεμινάριο.

Μέθοδοι για την κατάργηση διπλότυπων από λίστες Python

Ας πάρουμε ένα πραγματικό παράδειγμα. Ας υποθέσουμε ότι είστε στο πάρτι γενεθλίων του φίλου σας.🎊🎉

Στη συλλογή των γλυκών που εμφανίζεται, βλέπετε ότι υπάρχουν μερικά αντικείμενα που επαναλαμβάνονται. Τώρα θέλετε να αφαιρέσετε αυτά τα διπλότυπα από τη λίστα των γλυκών.

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

sweets = ["cupcake","candy","lollipop","cake","lollipop","cheesecake","candy","cupcake"]

Στην παραπάνω λίστα γλυκών, τα είδη «καραμέλα» και «καπκέικ» επαναλαμβάνονται δύο φορές. Ας χρησιμοποιήσουμε αυτήν τη λίστα παραδειγμάτων για να αφαιρέσουμε τα διπλότυπα στοιχεία.

Επαναλάβετε τις λίστες Python για να αφαιρέσετε διπλότυπα

Η πιο απλή μέθοδος είναι να δημιουργήσετε μια νέα λίστα που περιέχει κάθε στοιχείο ακριβώς μία φορά.

Διαβάστε μέσα από το κελί κώδικα παρακάτω:

unique_sweets = []
for sweet in sweets:
  if sweet not in unique_sweets:
    unique_sweets.append(sweet)

print(unique_sweets)

# Output
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']
  • Αρχικοποιούμε μια κενή λίστα unique_sweets.
  • Καθώς περιηγούμαστε στη λίστα γλυκών, έχουμε πρόσβαση σε κάθε γλυκό.
  • Εάν το γλυκό δεν υπάρχει ήδη στη λίστα unique_sweets, το προσθέτουμε στο τέλος της λίστας unique_sweets χρησιμοποιώντας τη μέθοδο .append().
  17 Πλατφόρμα διαδικτυακών μαθημάτων λογιστικής για όλους

Ας υποθέσουμε ότι συναντάτε ένα επαναλαμβανόμενο αντικείμενο, για παράδειγμα, τη δεύτερη εμφάνιση «καραμέλας» στη λίστα γλυκών. Αυτό δεν προστίθεται στη λίστα unique_sweets καθώς είναι ήδη παρούσα: το sweet not in unique_sweets αξιολογείται σε False για τη δεύτερη εμφάνιση του “cupcake” και του “candy”.

Επομένως, σε αυτήν τη μέθοδο, κάθε στοιχείο εμφανίζεται ακριβώς μία φορά στη λίστα unique_sweets—χωρίς καμία επανάληψη.

Χρησιμοποιήστε την κατανόηση λίστας για να αφαιρέσετε διπλότυπα

Μπορείτε επίσης να χρησιμοποιήσετε την κατανόηση λίστας για να συμπληρώσετε τη λίστα unique_sweets.

Θέλετε να ανανεώσετε τα βασικά της κατανόησης λίστας;

▶️ Δείτε το σεμινάριο για την κατανόηση λιστών στην Python.

Ας χρησιμοποιήσουμε την έκφραση κατανόησης λίστας: [output for item in iterable if condition is True] για να ξαναγράψουμε συνοπτικά το παραπάνω looping.

unique_sweets = []
[unique_sweets.append(sweet) for sweet in sweets if sweet not in unique_sweets]
print(unique_sweets)

# Output
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

Παρόλο που δημιουργείτε μια νέα λίστα, δεν συμπληρώνετε τη λίστα που δημιουργήθηκε με τιμές. Αυτό συμβαίνει επειδή η έξοδος είναι η λειτουργία .append() στη λίστα unique_sweets.

Για να αφαιρέσετε διπλότυπα στοιχεία από λίστες Python, μπορείτε επίσης να χρησιμοποιήσετε ενσωματωμένες μεθόδους λίστας και θα το καλύψουμε στην επόμενη ενότητα.

Χρησιμοποιήστε τις μεθόδους ενσωματωμένης λίστας για την κατάργηση διπλότυπων

Μπορείτε να χρησιμοποιήσετε τις μεθόδους λίστας Python .count() και .remove() για να αφαιρέσετε διπλότυπα στοιχεία.

– Με τη σύνταξη list.count(value), η μέθοδος .count() επιστρέφει τον αριθμό των φορών που εμφανίζεται η τιμή στη λίστα. Άρα το πλήθος που αντιστοιχεί σε επαναλαμβανόμενα στοιχεία θα είναι μεγαλύτερο από 1.

– list.remove(value) αφαιρεί την πρώτη εμφάνιση τιμής από τη λίστα.

Χρησιμοποιώντας τα παραπάνω, έχουμε τον παρακάτω κώδικα.

for sweet in sweets:
  # check if the count of sweet is > 1 (repeating item)
  if sweets.count(sweet) > 1:
  # if True, remove the first occurrence of sweet
    sweets.remove(sweet)

print(sweets)

# Output
['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

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

  • Εάν ένα συγκεκριμένο στοιχείο είναι διπλό (εμφανίζεται ακριβώς δύο φορές), αυτή η μέθοδος καταργεί την πρώτη εμφάνιση.
  • Εάν ένα συγκεκριμένο αντικείμενο επαναλαμβάνεται K φορές, τότε μετά την εκτέλεση του παραπάνω κώδικα, οι επαναλήψεις K-1 θα εξακολουθήσουν να παραμένουν.
  Πώς να χρησιμοποιήσετε Ζωντανούς υπότιτλους σε ένα τηλέφωνο Google Pixel

Γενικά όμως, όταν λέμε διπλότυπα, συνήθως αναφερόμαστε σε όλες τις επαναλήψεις.

Για να χειριστείτε αυτήν την περίπτωση, θα μπορούσατε να τροποποιήσετε τον παραπάνω βρόχο για να αφαιρέσετε όλες τις επαναλήψεις εκτός από μία. Αντί να χρησιμοποιήσετε ένα εάν υπό όρους για να ελέγξετε την καταμέτρηση ενός συγκεκριμένου στοιχείου, θα μπορούσατε να εκτελέσετε έναν βρόχο while για να αφαιρέσετε επανειλημμένα τις διπλοτυπίες έως ότου ο αριθμός κάθε στοιχείου στη λίστα είναι 1.

Η λίστα με τα γλυκά περιέχει πλέον 2 επαναλήψεις του «καπκέικ» και 3 επαναλήψεις του «καραμέλα».

sweets = ["cupcake","candy","lollipop","cake","lollipop","candy","cheesecake","candy","cupcake"]

Μπορείτε να χρησιμοποιήσετε έναν βρόχο while για να αφαιρέσετε τις επαναλήψεις, όπως φαίνεται παρακάτω. Ο βρόχος while συνεχίζει να λειτουργεί όσο ο αριθμός των γλυκών στα γλυκά είναι μεγαλύτερος από 1. Όταν απομένει μόνο μία εμφάνιση, η συνθήκη sweets.count(sweet) > 1 γίνεται False και ο βρόχος μεταβαίνει στο επόμενο στοιχείο.

for sweet in sweets:
  # check if the count of sweet is > 1 (repeating item)
  while(sweets.count(sweet) > 1):
  # repeatedly remove the first occurrence of sweet until one occurrence remains.
    sweets.remove(sweet)

print(sweets)
# Output
['cake', 'lollipop', 'cheesecake', 'candy', 'cupcake']

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

Μέχρι στιγμής, μάθαμε τα εξής:

  • Μέθοδοι αφαίρεσης διπλότυπων στοιχείων από λίστες Python—δημιουργώντας νέες λίστες—που περιέχουν μόνο μοναδικά στοιχεία
  • Ενσωματωμένες μέθοδοι λίστας .count() και .remove() για να τροποποιήσετε τη λίστα στη θέση της

Υπάρχουν ορισμένες ενσωματωμένες δομές δεδομένων Python που απαιτούν οι τιμές να είναι όλες μοναδικές—χωρίς επανάληψη. Επομένως, μπορούμε να μεταφέρουμε μια λίστα Python σε μία από αυτές τις δομές δεδομένων για να αφαιρέσουμε τα διπλότυπα. Και μετά μετατρέψτε τα ξανά σε λίστα. Θα μάθουμε πώς να το κάνουμε αυτό στις επόμενες ενότητες.

Μεταφέρετε τη λίστα Python σε ένα σύνολο για αφαίρεση διπλότυπων

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

Μπορείτε να ρίξετε οποιοδήποτε Python iterable σε ένα σύνολο χρησιμοποιώντας τη σύνταξη: set(iterable).

Τώρα, ας ρίξουμε τη λίστα γλυκών σε ένα σετ και ας εξετάσουμε το αποτέλεσμα.

set(sweets)
# Output
{'cake', 'candy', 'cheesecake', 'cupcake', 'lollipop'}

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

  Πώς να καταλάβετε εάν το τηλέφωνό σας έχει πατηθεί

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

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

unique_sweets = list(set(sweets))
print(unique_sweets)

# Output
['cake', 'cheesecake', 'candy', 'cupcake', 'lollipop']

Χρησιμοποιήστε τα στοιχεία λίστας ως κλειδιά λεξικού για να αφαιρέσετε διπλότυπα

Το λεξικό Python είναι μια συλλογή ζευγών κλειδιών-τιμών όπου τα κλειδιά προσδιορίζουν μοναδικά τις τιμές.

Μπορείτε να δημιουργήσετε ένα λεξικό Python χρησιμοποιώντας τη μέθοδο .fromkeys() με τη σύνταξη: dict.fromkeys(κλειδιά, τιμές). Εδώ, τα κλειδιά και οι τιμές είναι επαναληπτικές που περιέχουν τα κλειδιά και τις τιμές του λεξικού, αντίστοιχα.

  • Τα κλειδιά είναι μια απαιτούμενη παράμετρος και μπορεί να είναι οποιοδήποτε επαναληπτικό Python που αντιστοιχεί στα κλειδιά του λεξικού.
  • Οι τιμές είναι μια προαιρετική παράμετρος. Εάν δεν καθορίσετε τις τιμές που μπορούν να επαναληφθούν, χρησιμοποιείται η προεπιλεγμένη τιμή του None.

Χωρίς να καθορίσει τις τιμές, το dict.fromkeys(sweets) επιστρέφει ένα λεξικό Python όπου οι τιμές έχουν οριστεί σε None – η προεπιλεγμένη τιμή. Το παρακάτω κελί κώδικα εξηγεί αυτό.

dict.fromkeys(sweets)

# Output
{'cake': None,
 'candy': None,
 'cheesecake': None,
 'cupcake': None,
 'lollipop': None}

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

unique_sweets = list(dict.fromkeys(sweets))
print(unique_sweets)
# Output
['cupcake', 'candy', 'lollipop', 'cake', 'cheesecake']

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

Συνοψίζοντας👩‍🏫

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

  • Χρησιμοποιήστε τη μέθοδο λίστας Python .append() για να προσθέσετε μη επαναλαμβανόμενα στοιχεία σε μια νέα λίστα. Η νέα λίστα περιέχει κάθε στοιχείο στην αρχική λίστα ακριβώς μία φορά και καταργεί όλες τις επαναλήψεις. Μπορείτε επίσης να το κάνετε αυτό χρησιμοποιώντας την κατανόηση λίστας.
  • Χρησιμοποιήστε τις ενσωματωμένες μεθόδους .count() και .remove() για να αφαιρέσετε στοιχεία που εμφανίζονται ακριβώς δύο φορές. Το ίδιο μπορεί να τοποθετηθεί σε βρόχο while για να αφαιρεθούν όλες οι πρόσθετες εμφανίσεις.
  • Ρίξτε μια λίστα Python σε ένα σύνολο για να διατηρήσετε μόνο τα μοναδικά στοιχεία.
  • Χρησιμοποιήστε το dict.fromkeys(list) για να αφαιρέσετε τυχόν διπλότυπα από τη λίστα, καθώς δεν θα πρέπει να υπάρχουν κλειδιά επανάληψης του λεξικού.

Στη συνέχεια, ελέγξτε τα έργα Python για εξάσκηση και μάθηση. Ή μάθετε πώς μπορείτε να βρείτε το ευρετήριο ενός στοιχείου σε λίστες Python. Καλή μάθηση!