How to convert a dictionary to a list of keys, with repeat counts given by the values?

前端 未结 5 512
醉梦人生
醉梦人生 2020-12-10 09:47

I need your help to solve a problem.

I want to convert a dictionary d = {key1:value1, key2:value2} into list= [keys1, keys1, ... (value1 times), k

相关标签:
5条回答
  • 2020-12-10 10:05

    The easiest solution is to use collections.Counter. It features an elements() method that yields all elements with the correct count:

    >>> from collections import Counter
    >>> list(Counter(d1).elements())
    [4, 3, 3, 12, 12]
    

    If you want to implement this yourself, I think the most readable version is this for loop:

    from itertools import repeat
    
    result = []
    for k, count in d1.items():
        result += repeat(k, count)
    
    0 讨论(0)
  • 2020-12-10 10:07
    d1={4:1,3:2,12:2} 
    ans =[]
    for key,value in d1.items():
        ans.append((str(key),)*value)
    print(ans)
    flattened = []
    list(flattened.extend(item) for item in ans)
    print(flattened)
    

    Output:

    [('4',), ('3', '3'), ('12', '12')]
    ['4', '3', '3', '12', '12']
    
    0 讨论(0)
  • 2020-12-10 10:07

    For less complex amd more readable soultion, in addition, no extra packages are required, your code could be as the following:

    nums1 = {4: 1, 3: 2, 12: 2} 
    nums2 = []
    for key, value in nums1.items():
        nums2 += [key]*value
    
    print(nums2)
    

    which outputs with the following:

    [4, 3, 3, 12, 12]
    
    0 讨论(0)
  • 2020-12-10 10:15

    You can use a comprehension like below:

    list(chain.from_iterable(map(int, ((str(k) + ',') * v).split(',')[:-1]) for k, v in d1.items()))
    

    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]
    

    To avoid all those fancy splits and map, you can go for:

    [k for k, v in d1.items() for _ in range(v)]
    

    which also outputs the desired output.

    0 讨论(0)
  • 2020-12-10 10:31

    Just use repeat, which yields an element a specified number of times, with chain to combine everything together:

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

    Output:

    [4, 3, 3, 12, 12]
    
    0 讨论(0)
提交回复
热议问题