Friday, May 16, 2014

αφαιρεση στοιχειων μιας λιστας με Python

Ενα απλο προβλημα που θα μπορουσαμε να εχουμε ειναι να διαγραψουμε καποια συγκεκριμενα στοιχεια μιας λιστας. Αν πουμε οτι αυτη η λιστα περιεχει τα στοιχεια [1,2,3,2,1]. Η πιο απλη περιπτωση ειναι να μας ζητηθει να διαγραψουμε ενα συγκεκριμενο στοιχειο. Ας πουμε το '2'.

mylist.remove(2)

αυτο θα διαγραψει το πρωτο στοιχειο που θα βρει και να γυρισει

>>[1,3,2,1]

Στην περιπτωση που θελαμε να διαγραψουμε και τα δυο δυαρια στη λιστα?

for item in mylist:
....mylist.remove(2)

Αυτο θα γυρναγε λαθος, παρολο που θα γινοταν αυτο που θελαμε, επειδη θα εφτανε στο σημειο να διαγραψει ενα στοιχειο το οποιο δεν θα υπαρχει στη λιστα.

Μια καλη 'φορμουλα' για αυτο θα ηταν:

[mylist.remove(x) for x in n if x==2]


Τι γινεται αν θελουμε να διαγραψουμε ομως τα μοναδικα στοιχεια της λιστας?
Δηλ στην περιπτωση της mylist εχουμε [1,2,3,2,1]. Το μοναδικο στοιχειο εδω ειναι το '3'. Ουσιαστικα πρεπει για καθε ενα στοιχειο στη λιστα να βρουμε αν υπαρχει αλλο παρομοιο απο το επομενο στοιχειο μεχρι το τελος της λιστας. Αν δεν υπαρχει να το διαγραψουμε.

for y in mylist:
....pos=mylist.index(y)
....if y not in mylist[pos+1:]:
........mylist.pop(pos)

Αυτο φαινεται να δουλευει μια χαρα για τη λιστα που εχουμε. Αν την τροποποιησουμε ομως λιγο το αποτελεσμα θα μας ξαφνιασει πιθανον. Δοκιμαστε να αλλαξετε σειρα, να προσθεσετε ή να αφαιρεσετε. !!!!!!

Η ερωτηση ειναι σε πιο position παει οταν διαγραφει ενα απο την αρχικη λιστα??

mylist=[1,2,3,4,5]

και τρεχουμε τον παραπανω κωδικα...
>>[2,4]

Το επομενο value που θα περνει το pos θα ειναι δηλ ενα μετα απο καθε διαγραφη, αφου το indexing θα εχει αλλαξει.

Οποτε ισως καταληξουμε σε κατι σαν

nlist=[]
    for y in mylist:
        pos=mylist.index(y)
        if y not in mylist[pos+1:]:
            nlist.append(y)
           
    for ind in nlist:
        mylist.remove(ind)

OK! Αυτο πρεπει να δουλευει... Αλλα σιγουρα δεν ειναι το πιο αποδοτικο. Κατι που παιρνω απο το Veky και μαρεσε πολυ ειναι η χρηση της μεθοδου Counter.

from collections import Counter
    nonunique = Counter(data) - Counter(set(data))
    return [x for x in data if x in nonunique]
 
Τοσο απλο. Η Counter γυρναει ενα dictionary με τη συχνοτητα καθε στοιχειου στο value. Εδω αφαιρει τα values και αυτο του δινει τα μη-μοναδικα στοιχεια. Μετα ολα ειναι απλα. 
 
 

No comments: