Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字典转换为基于值的长度的列表_Python_List_Dictionary - Fatal编程技术网

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

Python 将字典转换为基于值的长度的列表,python,list,dictionary,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] 但我希望它是一个列表。如何做到这一

我有一本字典

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]
但我希望它是一个列表。如何做到这一点?

一种方法是将子列表粘合在一起

>>> list(itertools.chain(*[[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()进行预排序即可


[k代表k,v代表d.items()代表范围(v)]
... 我想

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


[k代表k,v在排序中(d.items())代表范围内(v)]

您可以使用列表理解:

[i for i in d for j in range(d[i])]
收益率:

[1, 1, 1, 10, 10, 5, 5, 5, 5, 5, 5]
您可以再次对其进行排序以获得您要查找的列表。

方法正是这样做的:

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]

或者,您可以在执行列表理解之前对
d
进行排序。对于大型字典,这会更快,因为字典的项比结果列表的项少。换言之,
[i代表范围(d[i])中的i(d)代表范围(d[i])]
[1, 1, 1, 10, 10, 5, 5, 5, 5, 5, 5]
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]