2 votes

zipper deux listes de taille différente pour en faire des dictionnaires

Je dispose des deux listes suivantes, de taille différente, et je souhaite les combiner en un dictionnaire à l'aide de la fonction zip() fonction.

stocks = ['CAT', 'IBM', 'MSFT']
prices = [20, 30, 40, 21, 31, 41, 22, 32, 42, 23, 33, 43]

Voici ce que j'essaie de faire :

from itertools import cycle
ziplist = []
ziplist.append(dict(zip(cycle(stocks), prices)))

J'obtiens la sortie suivante :

[{'CAT': 23, 'IBM': 33, 'MSFT': 43}]

Le résultat attendu est une liste avec des dicts multiples :

[{'CAT': 20, 'IBM': 30, 'MSFT': 40}, {'CAT': 21, 'IBM': 31, 'MSFT': 41}, {'CAT': 22, 'IBM': 32, 'MSFT': 42}, {'CAT': 23, 'IBM': 33, 'MSFT': 43}]

3voto

Stephen Rauch Points 29619

Utilisation de cycle ne vous permettra pas de voir les divisions. Au lieu de cela, bouclez la longueur calculable. Vous pouvez utiliser un itérateur pour savoir où vous vous trouvez dans la liste des prix :

Code :

prices_iter = iter(prices)
data = [dict(zip(stocks, prices_iter)) for i in range(len(prices) // len(stocks))]

Code de test :

stocks = ['CAT', 'IBM', 'MSFT']
prices = [20, 30, 40, 21, 31, 41, 22, 32, 42, 23, 33, 43]

prices_iter = iter(prices)
data = [dict(zip(stocks, prices_iter)) for i in range(len(prices) // len(stocks))]

print(data)

Résultats :

[
    {'IBM': 30, 'MSFT': 40, 'CAT': 20}, 
    {'IBM': 31, 'MSFT': 41, 'CAT': 21}, 
    {'IBM': 32, 'MSFT': 42, 'CAT': 22}, 
    {'IBM': 33, 'MSFT': 43, 'CAT': 23}
]

2voto

Javier Points 331

Peut-être ça ?

stocks = ['CAT', 'IBM', 'MSFT']
prices = [20, 30, 40, 21, 31, 41, 22, 32, 42, 23, 33, 43]

[dict(zip(stocks,prices[i:i+len(stocks)])) for i in range(0,len(prices),len(stocks))]

2voto

Jean-François Fabre Points 94672

Créer un itérateur à partir de prices puis construire les sous-répertoires le nombre approprié de fois, en choisissant une valeur à la fois avec next :

stocks = ['CAT', 'IBM', 'MSFT']
prices = [20, 30, 40, 21, 31, 41, 22, 32, 42, 23, 33, 43]

price_iter = iter(prices)

result = [{x:next(price_iter,0) for x in stocks} for _ in range(len(prices)//len(stocks)) ]

(dans ce cas, si prices est trop court, next donne 0 comme valeur par défaut grâce au deuxième argument)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X