J'essaie de créer dict
par imbriqué list
:
groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
L = [{y:x[0] for y in x if y != x[0]} for x in groups]
d = { k: v for d in L for k, v in d.items()}
print (d)
{'B': 'Group1', 'C': 'Group2', 'D': 'Group2', 'A': 'Group1'}
Mais cela semble un peu compliqué.
Y a-t-il une meilleure solution?
Qu'en est-il de:
d = {k:row[0] for row in groups for k in row[1:]}
Cela donne:
>>> {k:row[0] for row in groups for k in row[1:]}
{'D': 'Group2', 'B': 'Group1', 'C': 'Group2', 'A': 'Group1'}
Vous parcourez donc chaque row
dans le groups
. Le premier élément de la ligne est pris comme valeur (row[0]
) et vous parcourez row[1:]
pour obtenir toutes les clés k
.
Aussi étrange que cela puisse paraître, cette expression fonctionne également lorsque vous lui donnez une ligne vide (comme groups = [[],['A','B']]
). C'est parce que row[1:]
sera vide et donc le row[0]
la pièce n'est jamais évaluée:
>>> groups = [[],['A','B']]
>>> {k:row[0] for row in groups for k in row[1:]}
{'B': 'A'}
Il s'agit essentiellement d'une version plus jolie de Willem:
>>> groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
>>> {k:g for g,*tail in groups for k in tail}
{'B': 'Group1', 'A': 'Group1', 'C': 'Group2', 'D': 'Group2'}
Mais cela ne fonctionnera pas avec une liste vide: groups = [[],['A','B']]
>>> {k:head for head, *tail in grps for k in tail}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <dictcomp>
ValueError: not enough values to unpack (expected at least 1, got 0)
Je pense qu'une solution en ligne est un peu confuse. J'écrirais du code comme ci-dessous
groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
result = {}
for group in groups:
for item in group[1:]:
result[item] = group[0]
print result
J'aime aussi la solution de Willem, mais juste pour être complète ...
une autre variante utilisant itertools et une fonction de générateur (Python 3.x uniquement)
def pairs(groups):
for value,*keys in groups:
for key_value in Zip(keys, itertools.repeat(value)):
yield key_value
dict(pairs(groups))
{'A': 'Group1', 'B': 'Group1', 'C': 'Group2', 'D': 'Group2'}