2
votes

Comment convertir un dictionnaire en une liste de clés, avec des nombres de répétitions donnés par les valeurs?

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}


0 commentaires

5 Réponses :


1
votes

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()))


1 commentaires

La même chose pourrait être écrite un peu plus courte que list (chain.from_iterable (starmap (repeat, source.items ())))



0
votes

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.


0 commentaires

0
votes
[('4',), ('3', '3'), ('12', '12')]
['4', '3', '3', '12', '12']

0 commentaires

0
votes

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


0 commentaires

3
votes

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]


0 commentaires