2016-06-23 7 views
1

Was ich tun möchte, ist String-Elemente aus meiner Liste zu entfernen, die einige doppelte Teile haben. Zum Beispiel, wenn ich eine Liste angegeben habe.Entfernen Element aus der Liste, wenn Teil der Zeichenfolge doppelt ist

ls = ['02/27/1960', '07/21/2004', '08/13/2004', '09/12/2004', '02/27', '07/21', '08/13'] 

Ich möchte Ausgabe als

ls_out = ['02/27/1960', '07/21/2004', '08/13/2004', '09/12/2004'] 

Das ist '02/27' bereits in '02/27/1960' existierte.

(Notiz, dass ich nicht sicher bin, ob diese Frage dupliziert wird oder nicht)

+0

Sie diese brauchen Sie nur arbeiten mit Daten in diesem Format oder willkürliche Zeichenfolgen? –

+0

Hallo @Max Feng, gerade jetzt möchte ich in diesem gegebenen Format tun. Vielen Dank! – titipata

Antwort

3

Dies auch mit einer for Schleife und any integrierte Methode lösen sein:

>>> ls 
['02/27/1960', '07/21/2004', '08/13/2004', '09/12/2004', '02/27', '07/21', '08/13'] 
>>> 
>>> ls_out = [] 
>>> 
>>> for x in ls: 
     if not any([x in item for item in ls_out]): 
      ls_out.append(x) 


>>> ls_out 
['02/27/1960', '07/21/2004', '08/13/2004', '09/12/2004'] 

OR:

>>> for x in ls: 
     if all([x not in item for item in ls_out]): 
      ls_out.append(x) 


>>> ls_out 
['02/27/1960', '07/21/2004', '08/13/2004', '09/12/2004'] 
+0

Vielen Dank @Iron Fist, das funktioniert wirklich gut für mich! – titipata

+0

@titipat .. no pblm ..;) –

+1

Generator Verständnis statt List Verständnis mit dem 'Any' Ansatz scheint, als wäre es die effizienteste. Es scheint mir auch so zu sein, dass 'x not in ls_out' zu viel ist. Besser, nur zu verwenden: 'wenn nicht (x in Artikel für Artikel in ls_out):' –

1

Ich bin nicht sicher, ob dies der effizienteste Weg, dies zu tun, aber es wäre auf jeden Fall funktionieren:

ls = ['02/27/1960', '07/21/2004', '08/13/2004', '09/12/2004', '02/27', '07/21', '08/13'] 

ls2 = ls 

for item in ls: 
    for dup_item in ls2: 
    if item == dup_item: 
     continue 
    if item.startswith(dup_item): 
     _ = ls.pop(ls.index(dup_item)) 

print ls 

Grundsätzlich erstellt es zwei identische Listen, führt Schleifen durch beide und prüft, ob sie gleich sind - wenn sie sind, überspringt es. Wenn nicht, prüft es, ob sie mit dem anderen beginnen. Wenn dies der Fall ist, wird es entfernt.

+0

OMG, danke @AbrahamB, diese Arbeit wie ein Charme! – titipata

1
cache = set() 
def fun(s): 
    ss = s.split('/') 
    key = ss[0] + '/' + ss[1] 
    if key in cache: 
     return None 
    else: 
     cache.add(key) 
     return s 

ls = ['02/27/1960', '07/21/2004', '08/13/2004', '09/12/2004', '02/27', '07/21', '08/13'] 

new_ls = filter(fun, ls) 
print new_ls 
+0

Es macht mehr Sinn, einen Satz als Cache zu verwenden als ein Wörterbuch mit einem nutzlosen Mapping. –

+0

Zuerst, danke @atline! @ juanpa.arrivillaga Ich verstehe. Also muss ich 'cache' in einen leeren Satz ändern und prüfen, ob' key' in 'cache' ist, denke ich. – titipata

+0

Wie wäre es mit oben? Scheint wirklich besser als Hash eingestellt. – lagom

Verwandte Themen