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]