J'ai besoin de votre aide pour résoudre un problème.
Je souhaite convertir un dictionnaire d = {key1: value1, key2: value2} en
list = [keys1, keys1, ... (value1 fois), keys2, ... (value2 fois)] sans utiliser de boucle imbriquée.
Exemple: p >
for key, value in nums1.items():
temp = (str(key))*value
nums2.append(int(temp))
print(nums2)
Le code devrait produire la sortie:
l = [4, 3, 3, 12, 12]
Voici ce que j'ai:
d1 = {4: 1, 3: 2, 12: 2}
5 Réponses :
Il suffit d'utiliser repeat , qui donne un élément un nombre spécifié de fois, avec chain pour tout combiner ensemble:
[4, 3, 3, 12, 12]
Sortie :
from itertools import chain, repeat
source = {4: 1, 3: 2, 12: 2}
list(chain.from_iterable(repeat(element, times) for element, times in source.items()))
La même chose pourrait être écrite un peu plus courte que list (chain.from_iterable (starmap (repeat, source.items ())))
Vous pouvez utiliser une compréhension comme ci-dessous:
[k for k, v in d1.items() for _ in range(v)]
Code :
from itertools import chain
d1 = {4: 1, 3: 2, 12: 2}
print(list(chain.from_iterable(map(int, ((str(k) + ',') * v).split(',')[:-1]) for k, v in d1.items())))
# [4, 3, 3, 12, 12]
Pour éviter tout cela fancy splits et map , vous pouvez choisir:
list(chain.from_iterable(map(int, ((str(k) + ',') * v).split(',')[:-1]) for k, v in d1.items()))
qui génère également la sortie souhaitée.
[('4',), ('3', '3'), ('12', '12')]
['4', '3', '3', '12', '12']
Pour une soultion moins complexe et plus lisible, en outre, aucun paquet supplémentaire n'est requis, votre code pourrait être le suivant:
[4, 3, 3, 12, 12]
qui génère ce qui suit:
XXX
La solution la plus simple consiste à utiliser collections.Counter . Il comporte une méthode elements () qui donne tous les éléments avec le nombre correct:
from itertools import repeat
result = []
for k, count in d1.items():
result += repeat(k, count)
Si vous souhaitez implémenter cela vous-même, je pense que la version la plus lisible est cette boucle for :
>>> from collections import Counter >>> list(Counter(d1).elements()) [4, 3, 3, 12, 12]