一种方法是使用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_iterable
和itertools.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())]))
或者你可以在做列表理解之前对'd'进行排序。对于大型字典,这会更快,因为字典中的项目数量少于生成的列表数量。换句话说,'[我为我在排序(d)为j在范围内(d [i])]''。 –