Υπάρχει ένα ενσωματωμένο πρόγραμμα που αφαιρεί τα διπλότυπα από τη λίστα στην Python, διατηρώντας τη σειρά; Ξέρω ότι μπορώ να χρησιμοποιήσω ένα σύνολο για να αφαιρέσω τα αντίγραφα, αλλά αυτό καταστρέφει την αρχική σειρά. Ξέρω επίσης ότι μπορώ να φτιάξω το δικό μου ως εξής:
def uniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
return output
(Ευχαριστώ το unwind για αυτό το δείγμα κώδικα).
Αλλά θα ήθελα να επωφεληθώ από ένα ενσωματωμένο ή ένα πιο πυθωνικό ιδίωμα αν είναι δυνατόν.
Εδώ έχετε μερικές εναλλακτικές λύσεις: <http://www.peterbe.com/plog/uniqifiers-benchmark>,
Το γρηγορότερο:
def f7(seq):
seen = set()
seen_add = seen.add
return [x for x in seq if not (x in seen or seen_add(x))]
Γιατί να αναθέσετε το seen.add
στο seen_add
αντί να καλέσετε απλά το seen.add
; Η Python είναι μια δυναμική γλώσσα και η επίλυση της seen.add
σε κάθε επανάληψη είναι πιο δαπανηρή από την επίλυση μιας τοπικής μεταβλητής. Η seen.add
θα μπορούσε να έχει αλλάξει μεταξύ των επαναλήψεων, και το runtime δεν είναι αρκετά έξυπνο για να το αποκλείσει αυτό. Για να είναι ασφαλής, πρέπει να ελέγχει το αντικείμενο κάθε φορά.
Αν σκοπεύετε να χρησιμοποιήσετε αυτή τη συνάρτηση συχνά στο ίδιο σύνολο δεδομένων, ίσως θα ήταν καλύτερα να χρησιμοποιήσετε ένα διατεταγμένο σύνολο: <http://code.activestate.com/recipes/528878/>,
O(1) εισαγωγή, διαγραφή και έλεγχος μέλους ανά λειτουργία.
(Μικρή πρόσθετη σημείωση: η seen.add()
επιστρέφει πάντα None
, οπότε το or
παραπάνω υπάρχει μόνο ως τρόπος για να επιχειρήσετε μια ενημέρωση συνόλου και όχι ως αναπόσπαστο μέρος του λογικού ελέγχου).
from itertools import groupby
[ key for key,_ in groupby(sortedList)]
Η λίστα δεν χρειάζεται καν να είναι ταξινομημένη, η επαρκής συνθήκη είναι ότι οι ίσες τιμές ομαδοποιούνται μαζί.
Επεξεργασία: Υπέθεσα ότι η "διατήρηση της σειράς" υπονοεί ότι η λίστα είναι πραγματικά ταξινομημένη. Αν αυτό δεν ισχύει, τότε η λύση του MizardX είναι η σωστή.
Κοινοτική επεξεργασία: Αυτός είναι πάντως ο πιο κομψός τρόπος για τη "συμπίεση διπλών διαδοχικών στοιχείων σε ένα μόνο στοιχείο".