6
votes

Liste combinée et compréhension dict

J'ai une sorte de logique verbeuse que j'aimerais compacter avec certaines compréhensions.

Essentiellement, j'ai un objet dict que je lis à partir de laquelle il y a 16 valeurs que je suis concerné avec . Je reçois les clés que je veux avec la compréhension suivante: xxx

Le type de dictionnaire source ressemble à ceci: xxx

J'aimerais bien cartographier ce dictionnaire pour être quelque chose comme ceci: xxx

Comment mapper les choses avec la liste et les compromies de dictionnaire pour transformer ma source de dicte Liste de destination des dictionnaires?


0 commentaires

3 Réponses :


8
votes

Ceci est une solution entièrement fonctionnelle pouvant être appliquée sur la taille arbitraire.

In [1]: d = {'I0': [0, 1, 5, 2], 'I1': [1, 3, 5, 2], 'I2': [5, 9, 10, 1]}

In [2]: map(lambda (k, v): map(lambda vv: (k, vv), v), _.iteritems())
Out[2]: 
[[('I1', 1), ('I1', 3), ('I1', 5), ('I1', 2)],
 [('I0', 0), ('I0', 1), ('I0', 5), ('I0', 2)],
 [('I2', 5), ('I2', 9), ('I2', 10), ('I2', 1)]]

In [3]: zip(*_)
Out[3]: 
[(('I1', 1), ('I0', 0), ('I2', 5)),
 (('I1', 3), ('I0', 1), ('I2', 9)),
 (('I1', 5), ('I0', 5), ('I2', 10)),
 (('I1', 2), ('I0', 2), ('I2', 1))]

In [4]: map(dict, _)
Out[4]: 
[{'I0': 0, 'I1': 1, 'I2': 5},
 {'I0': 1, 'I1': 3, 'I2': 9},
 {'I0': 5, 'I1': 5, 'I2': 10},
 {'I0': 2, 'I1': 2, 'I2': 1}]


0 commentaires

6
votes

Comment je le résoudrais:

Premièrement, je voudrais obtenir chaque clé une liste contenant des tuples, où le premier élément serait la clé et la seconde serait l'une des valeurs de la liste: P > xxx pré>

puis je transmerais cette liste, créant une liste de tuples contenant chaque clé correspondante, à l'aide de la fonction ZIP: p>

>>> pairs = [ [ (k, i) for i in l] for k, l in d.items() ]
>>> transversed = zip(*pairs)
>>> ds = [dict(t) for t in transversed]
>>> pprint(ds)
[{'I0': 0, 'I1': 1, 'I2': 5},
 {'I0': 1, 'I1': 3, 'I2': 9},
 {'I0': 5, 'I1': 5, 'I2': 10},
 {'I0': 2, 'I1': 2, 'I2': 1}]


2 commentaires

+1 pour l'élaboration étape par étape. Nos approches sont les mêmes sauf que j'ai effectué une utilisation intensive de carte :)


@qiao Oui, nous avons adopté la même approche de manière plus abstraite. J'ai juste une certaine préférence pour les compréhensions de la liste, mais votre solution est excellente.



0
votes

Il existe une solution courte et facile: xxx

La clé ici est la transposition de la matrice de transposition de valeurs, qui est effectuée avec zip (* valeurs) , puis nous venons de reconstruire dicts.


0 commentaires