Python - 将字典转换为基于值的长度的列表

时间:2016-10-11 22:23:24

标签: python list dictionary

我有一本字典

d = {1: 3, 5: 6, 10: 2}

我想将其转换为包含字典键的列表。每个密钥应重复与其相关值一样多次。

我已经编写了完成这项工作的代码:

d = {1: 3, 5: 6, 10: 2}
l = []
for i in d:
    for j in range(d[i]):
        l.append(i)
l.sort()
print(l)

输出:

[1, 1, 1, 5, 5, 5, 5, 5, 5, 10, 10]

但我希望它能成为列表理解。怎么办呢?

4 个答案:

答案 0 :(得分:2)

你可以使用列表理解来实现:

[i for i in d for j in range(d[i])]

的产率:

[1, 1, 1, 10, 10, 5, 5, 5, 5, 5, 5]

您可以再次对其进行排序以获取您要查找的列表。

答案 1 :(得分:1)

一种方法是使用itertools.chain将子列表粘合在一起

>>> list(itertools.chain(*[[k]*v for k, v in d.items()]))
[1, 1, 1, 10, 10, 5, 5, 5, 5, 5, 5]

或者,如果您正在处理一个非常大的字典,那么您可以避免使用itertools.chain.from_iterableitertools.repeat构建子列表

>>> list(itertools.chain.from_iterable(itertools.repeat(k, v) for k, v in d.items()))
[1, 1, 1, 10, 10, 5, 5, 5, 5, 5, 5]

使用包含两个循环的列表推导的非常大的字典的比较计时:

>>> d = {i: i for i in range(100)}
>>> %timeit list(itertools.chain.from_iterable(itertools.repeat(k, v) for k, v in d.items()))
10000 loops, best of 3: 55.6 µs per loop
>>> %timeit [k for k, v in d.items() for _ in range(v)]
10000 loops, best of 3: 119 µs per loop

目前尚不清楚您是否希望对输出进行排序(您的示例代码不对其进行排序),但如果是这样,则只需预先排序d.items()

# same as previous examples, but we sort d.items()
list(itertools.chain(*[[k]*v for k, v in sorted(d.items())]))

答案 2 :(得分:1)

[k for k,v in d.items() for _ in range(v)] ......我想......

如果你想要它排序你可以做

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

答案 3 :(得分:1)

Counter.elements()方法正是这样做的:

from collections import Counter

d = {1: 3, 5: 6, 10: 2}
c = Counter(d)
result = list(c.elements())
print(result)
# [1, 1, 1, 5, 5, 5, 5, 5, 5, 10, 10]