一种方法是使用
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()
进行排序即可。
list(itertools.chain(*[[k]*v for k, v in sorted(d.items())]))
d
进行排序。对于大型字典,这样做会更快,因为字典中的项比结果列表少。换句话说,[i for i in sorted(d) for j in range(d[i])]
。 - Rory Daulton