This is what I've got so far:
{ k1:v2 for (k1,v1) in d1 for (k2,v2) in d2 if v1 == k2 }
Zwei Dinge sollten Sie beachten:
1) Wenn Sie eine for-in-Schleife verwenden, um direkt auf einem dict:
for (k1, v1) in some_dict:
Python Schleifen über die Tasten im dict, das heißt, dass für-in-Schleife äquivalent zu:
for (k1, v1) in some_dict.keys()
Aber Sie python sagen, dass es eine zwei Tupel jedes Mal sein wird, durch die Schleife zurück, (k1, v1) zurückgibt, und python nur jedes Mal durch die Schleife Taste. Das ist also ein Fehler. Sie können, dass durch Schreiben korrigieren:
for (k1, v1) in some_dict.items()
Die Positionen() Funktion gibt einen zwei Tupel: (Schlüssel, Wert) jedes Mal durch die Schlaufe.
2) Angenommen, haben Sie diese Daten:
data = [
[1, 2, 3],
['a', 'b', 'c']
]
Schleife über jedes der sechs Werte, es fühlt sich natürlich zu schreiben:
results = [x for x in inner_array for inner_array in data]
Aber das erzeugt den Fehler:
Traceback (most recent call last):
File "1.py", line 5, in <module>
results = [x for x in inner_array for inner_array in data]
NameError: name 'inner_array' is not defined
Damit es funktioniert, müssen die Schleifen "rückwärts" geschrieben werden:
results = [x for inner_array in data for x in inner_array]
print results
--output:--
[1, 2, 3, 'a', 'b', 'c']
Ich denke, der einfachste Weg, das zu erinnern ist: die Schleifen in der gleichen Reihenfolge wie wenn man sie ohne eine Liste Verständnis schrieb:
results = []
for inner_array in data:
for x in inner_array:
results.append(x)
Ich persönlich würde gerne sehen geändert in Python, so dass innerhalb einer Liste/dict/set Verständnis Sie arbeiten "von innen nach außen", wie Sie es geschrieben haben. In jedem Fall sieht Ihr Code mit den Änderungen so aus:
d1 = {1:'a',2:'b',3:'c'}
d2 = {'a':'A','b':'B','c':'C'}
results = {
k1: v2
for (k2,v2) in d2.items()
for (k1,v1) in d1.items() if v1 == k2
}
print results
--output:--
{1: 'A', 2: 'B', 3: 'C'}
Dank an alle, ich wünschte, ich könnte mehr als einen akzeptieren. – Roma149