Chengming Gu
Chengming Gu

Reputation: 67

How to generate a list with repeating key from a dictionary?

I have a dictionary

a_dict = {1: 1, 4: 2, 5: 3, 6: 4}

I want to create a list such that the dict key appears value number of times:

a_list = [1, 4, 4, 5, 5, 5, 6, 6, 6, 6]  

My current code is like this:

a_list = []

for key in a_dict.keys():
    for value in a_dict.values():

I do not know what to do next?

Upvotes: 1

Views: 115

Answers (5)

a_guest
a_guest

Reputation: 36249

This can be done in a concise way using a list comprehension with nested for loops:

>>> d = {1: 1, 4: 2, 5: 3, 6: 4}
>>> [k for k, v in d.items() for _ in range(v)]
[1, 4, 4, 5, 5, 5, 6, 6, 6, 6]

However, please note that dict is an unordered data structure and therefore the order of keys in the resulting list is arbitrary.

May I ask for which purpose you want to use the resulting list? Maybe there is a better way of solving the actual problem.

Upvotes: 2

Cleb
Cleb

Reputation: 25997

A rather ugly list comprehension:

[vals for tuplei in d.items() for vals in [tuplei[0]] * tuplei[1]]

yields

[1, 4, 4, 5, 5, 5, 6, 6, 6, 6]

Slightly more readable (resulting in the same output):

[vals for (keyi, vali) in d.items() for vals in [keyi] * vali]

An itertools solution:

import itertools

list(itertools.chain.from_iterable([[k]*v for k, v in d.items()]))

will also give

[1, 4, 4, 5, 5, 5, 6, 6, 6, 6]

Short explanation:

[[k]*v for k, v in d.items()]

creates

[[1], [4, 4], [5, 5, 5], [6, 6, 6, 6]]

which is then flattened.

Upvotes: 2

NBlaine
NBlaine

Reputation: 493

dict = {1: 1, 4: 2, 5: 3, 6: 4}
list=[]
for key, value in dict.items():
  i = 0
  while i < value:
    list.append(key)
    i+=1

print(list)

Should do the trick

Upvotes: 0

TwistedSim
TwistedSim

Reputation: 2030

You are not mssing much!

a_dict = {1: 1, 4: 2, 5: 3, 6: 4}
a_list = []
for key, value in a_dict.items():
    a_list.extend([key]*value)
print(a_list)

Upvotes: 1

Magd Kudama
Magd Kudama

Reputation: 3469

How about this?

a={1: 1, 4: 2, 5: 3, 6: 4}
list=[]
for key, value in a.items():
    list.extend([key] * value)
print list

Upvotes: 2

Related Questions