一種方法是使用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])]''。 –