2016-10-11 69 views
3

我有一本字典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] 

但我想這是一個列表解析。如何才能做到這一點?

回答

2

您可以使用列表做COM捏:

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

產量:

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

您可以再次對其進行排序,讓你在尋找名單。

+2

或者你可以在做列表理解之前對'd'進行排序。對於大型字典,這會更快,因爲字典中的項目數量少於生成的列表數量。換句話說,'[我爲我在排序(d)爲j在範圍內(d [i])]''。 –

1

一種方法是使用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_iterableitertools.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())])) 
1

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

如果你需要它有序,你可以做

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