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

2024-04-20 00:14:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典

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]

但我希望它是一个列表。如何做到这一点


Tags: 代码in列表for字典rangesort次数
3条回答

一种方法是使用^{}将子列表粘合在一起

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

或者,如果您正在处理一个非常大的字典,那么您可以避免使用^{}^{}构建子列表

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

您可以使用列表来完成此操作:

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

收益率:

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

您可以再次对其排序,以获得您要查找的列表

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

如果你想把它分类,你可以这样做

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

相关问题 更多 >