2016-03-19 3 views
0

Ich versuche festzustellen, ob alle Elemente von search_string in einer der Zeichenfolgen in der Liste look_here_string vorhanden sind. Aus Gründen der Effizienz wird das Wort aus der Liste entfernt, wenn ein Element nicht vorhanden ist.Durchsuchen einer Liste von Zeichenfolgen für alle Elemente einer Zeichenfolge

search_string = '1abc' 
look_here_string = ['dedakloera', 'tuau', '1abcdefg'] 
x = 0 
counter = 0 

for item in search_string: 
    item = search_string[counter] 
    #print item, search_string, look_here_string[x] 
    if not item in look_here_string[x]: 
     print item, 'not in', look_here_string[x] 
     look_here_string.remove(look_here_string[x]) 
     counter = 0 
    else: 
     print item, 'in', look_here_string[x] 
     counter +=1 

Dies ist die Ausgabe ich suche:

1 not in dedakloera  
1 not in tuau   
1 in 1abcdefg   
a in 1abcdefg   
b in 1abcdefg   
c in 1abcdefg 

Dies ist die Ausgabe erhalte ich:

1 not in dedakloera #correct 
1 not in tuau   #correct 
1 in 1abcdefg   #correct 
a in 1abcdefg   #correct 

Es scheint, dass das Skript vorzeitig stoppt, aber ich kann‘ t herausfinden, was in meinem Code falsch ist. Ihre Hilfe wird gerne in Anspruch genommen!

+1

Weil Sie 'for item in search_string:' verwendet haben, was nur für n = len iterieren würde (search_string) und daher die Ausgabe nur 4-mal drucken würde. – ZdaR

+0

Wie würde ich das beheben? –

Antwort

1

Mehr einfacher Ansatz ist durch look_here_string in der äußeren Schleife

search_string = '1abc' 
look_here_string = ['dedakloera', 'tuau', '1abcdefg'] 
ind_to_remove = [] 
for i,s in enumerate(look_here_string): 
    for e in search_string: 
     if not e in s: 
      ind_to_remove.append(i) 
      print e, 'not in', s 
      break 
     else: 
      print e, 'in', s 
for i in ind_to_remove[::-1]: 
    del look_here_string[i] 
+0

Vielen Dank für diese Eingabe: Wenn ich Ihren Code richtig verstehe, konstruiere ich zuerst eine Liste von Indizes der fehlenden Strings und entferne dann die Items von look_here_string basierend auf dieser Liste. Das hat sehr geholfen! –

+0

@Johannes Schwaninger Sie sind willkommen) Und ja, Sie verstehen alles richtig. – kvorobiev

1

Sie könnten iterieren schreiben dies noch kurz die „alle“ builtin-Funktion und eine Liste Verständnis:

>>> search_string = '1abc' 
>>> look_here_string = ['dedakloera', 'tuau', '1abcdefg'] 
>>> [string for string in look_here_string 
      if all(char in string for char in search_string)] 

Dies schafft eine neue Liste, aber es wird ungültige Zeichenfolgen automatisch filtern.

+1

sehr prägnanter Code! - Danke für den Vorschlag, "alles" zu benutzen –