2017-06-13 5 views
0

Ich habe dieseMultiple If/else in Liste Verständnis Python

s = ['son','abc','pro','bro'] 
b = ['son','bro'] 
c = ['pro','quo'] 

Erwartete Ausgabe dieser ist. Wenn Elemente in der Ausgabe index(item_in_s) sind, wenn sie in der Liste b vorhanden ist. oder index(item_in_s)+10 wenn Artikel ist in c

[0,12,3] 

habe ich versucht, dieses

index_list = [s.index(item) if item in b else s.index(item)+10 if item in c for item in s] 
print(index) 

Aber anscheinend ist ein Syntaxfehler. Also habe ich versucht, diese

index_list = [s.index(item) if item in b else s.index(item)+10 for item in s if item in c] 
    print(index) 

Ausgang:

[12] 

Dies ändert sich nur die ganze Logik. Obwohl ich dies tun könnte

fin = [s.index(item) if item in b else s.index(item)+10 if item in c else '' for item in s] 
fin = [item for item in fin if item!=''] 
print(fin) 

gewünschte Ausgabe erhalten:

[0, 12, 3] 

Aber wie zu bekommen, was ich in Liste Verständnis will oder selbst ist es so etwas wie else continue in Listenkomprehensionen? Irgendwelche Erklärungen würden sehr geschätzt werden.

+0

Ich verstehe nicht wirklich, was Sie hier tun wollen. – Sam

+0

einfach etwas wie '[x wenn x in list1 else x + 10 wenn x in list2 für x in my_list]' was einen Syntaxfehler ergibt. – void

+0

Ich möchte etwas wie '[x wenn x in list1 else x + 10, wenn x in list2 sonst für x in my_list passierst]' aber ich weiß pass gibt syntax fehler auch. Irgendwelche Alternativen? – void

Antwort

0
index_list = [s.index(item) if item in b else s.index(item) + 10 for item in s if item in b or item in c] 

wir sicherstellen, dass es entweder in b oder c, dann wird der Index entweder der Fälle wird

2

Grundsätzlich eine Liste Verständnis zwingt Sie sehr ineffizient sein:

>>> [i if item in b else i + 10 if item in c else None for i, item in enumerate(s) if item in b or item in c] 
[0, 12, 3] 

Dies muss die Mitgliedschaft item in b und czweimal jedes im schlimmsten Fall überprüfen, wenn Sie diesen Ausgang wollen. Verwenden Sie stattdessen nur eine for-Schleife:

>>> index_list = [] 
>>> for i, item in enumerate(s): 
...  if item in b: 
...   index_list.append(i) 
...  elif item in c: 
...   index_list.append(i + 10) 
... 
>>> index_list 
[0, 12, 3] 
>>> 

Einfach, lesbar, geradlinig und Pythonic.

0

Ihre Lösung Glitch kann gelöst werden, indem die Elemente vermieden werden, die nicht in Liste b & c vorhanden sind.

Sie können dies tun, indem neue Liste erstellen und einfache Set-Operation in Ihrer Lösung

Überprüfung diese kleine Änderung anzuwenden.

fin = [s.index(item) if item in b else s.index(item)+10 if item in c else '' for item in list(set(b+c)&set(s))] 

durch diese Ihre conditinal Anweisung anderes zu tun ist nie Ursache Liste auszuführen gehen, auf dem Sie laufen sind nur Element, das entweder Liste in b oder c nur.

0

bereits gute Antworten gegeben, hier ist eine, die noch nicht erwähnt wird:

fin = [item for item in ([s.index(item) if item in b else s.index(item)+10 if item in c else '' for item in s]) if item!=''] 
print(fin) 

im Grunde ist es eine Kombination aus den ursprünglichen zwei Codezeilen:

fin = [s.index(item) if item in b else s.index(item)+10 if item in c else '' for item in s] 
fin = [item for item in fin if item!=''] 

Nicht unbedingt " schneller oder besser ", nur eine Kombination, die vorher nicht gegeben wurde. Wenn Sie List Comprehensions durchführen, haben Sie immer das Risiko, dass Sie mehr iterieren, als Sie wirklich benötigen.

Eine bessere Lösung wäre eine for Schleife, die in einer anderen Antwort gegeben wird.

+0

Es wäre nützlicher, wenn Sie erklären könnten, wie Ihre Lösung funktioniert und wie sie besser ist als die anderen Antworten. Code-only-Antworten sind nicht sehr hilfreich. – SiHa

+0

@SiHa; Antwort aktualisiert –

+0

Viel besser, danke. – SiHa