This is what I've got so far:
{ k1:v2 for (k1,v1) in d1 for (k2,v2) in d2 if v1 == k2 }
Due cose che si dovrebbe notare:
1) Quando si utilizza un ciclo for-in direttamente su una dict:
for (k1, v1) in some_dict:
loop pitone le chiavi del dict, vale a dire che, per-in loop è equivalente a:
for (k1, v1) in some_dict.keys()
Ma si sta dicendo python che ci sarà una due tupla restituita ogni volta attraverso il ciclo, (k1, v1), e Python restituisce solo una chiave di volta in volta attraverso il ciclo. Quindi questo è un errore. È possibile correggere che scrivendo:
for (k1, v1) in some_dict.items()
La funzione articoli() restituisce una tupla a due: (chiave, valore) di volta in volta attraverso il ciclo.
2) Supponiamo di avere questi dati:
data = [
[1, 2, 3],
['a', 'b', 'c']
]
Per un ciclo su ciascuno dei sei valori, ci si sente naturale per scrivere:
results = [x for x in inner_array for inner_array in data]
Ma che produce l'errore:
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
Per farlo funzionare, i loop devono essere scritti "all'indietro":
results = [x for inner_array in data for x in inner_array]
print results
--output:--
[1, 2, 3, 'a', 'b', 'c']
Penso che il modo più semplice per ricordare che è: i loop sono nello stesso ordine come se li hai scritto senza una lista di comprensione:
results = []
for inner_array in data:
for x in inner_array:
results.append(x)
Personalmente, mi piacerebbe vedere che ha cambiato in python, in modo che all'interno di una lista/dict/set di comprensione tu lavori da "dentro e fuori", come hai scritto tu. In ogni caso, questo è il tuo codice con le modifiche:
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'}
Grazie a tutti, vorrei poterne accettare più di uno. – Roma149