2016-12-15 7 views
1

Ich stieß auf eine Frage, die jemand list3 = [1, 0, 1, 0, 0] für list1 = [0, 1, 0, 0, 1 erzeugen wollte] und list2 = [0, 1, 0, 1, 1].Alternative Liste-Verständnis

Wenn man zip(list1, list2) daher nur zip(0, 0) würde 1 für list3 erzeugen würde.

Ich möchte den nachfolgenden Code durch eine Liste Verständnis ausdrücken:

L3 = [] 
for x in zip(L1, L2): 
    if sum(x) == 0: 
     L3.append(1) 
    else: 
     L3.append(0) 
print L3 

ich die gleiche Ausgabe Verständnis mithilfe dieser Liste erhalten können:

print [int(sum(x)==0) for x in zip(L1, L2)] 

Ich mag möchte wissen, ob es eine Möglichkeit, die if/else-Bedingung des ursprünglichen Codeblocks in einem Listenverständnis wörtlicher auszudrücken. Ich kann verstehen, dass diese Frage als überflüssig betrachtet werden könnte, da die if/else-Bedingung natürlich enthalten ist, aber die veröffentlichten Alternativen könnten für mich sehr nützlich sein.

Antwort

5

Sie könnten einen bedingten Ausdruck verwenden:

print [1 if sum(x) == 0 else 0 for x in zip(list1, list2)] 

Hier 1 if sum(x) == 0 else 0 drückt direkt auf den Zustand.

Weitere Informationen finden Sie Does Python have a ternary conditional operator?

Eine weitere Alternative ist die Logik in eine Funktion zum Faktor aus, und die Funktion aus der Liste Verständnis nennen. Dies würde es der Logik ermöglichen, beliebige Flusssteuerungsanweisungen (bedingte Anweisungen, Schleifen usw.) zu verwenden.

1
L1,L2 = [0, 1, 0, 0, 1], [0, 1, 0, 1, 1] 
# map and lambda 
L3 = map(lambda x: 1 if not sum(x) else 0, zip(L1, L2)) 
print L3 
# [1, 0, 1, 0, 0]