2016-12-18 110 views
-1

假設大多數Python的方式我有這樣初始化一個字典

d = { 
    1: [1,4,7], 
    2: [2,5,8], 
    0: [3,6,9]  
} 

一個字典它可以通過

d = {} 

for i in range(1,10): 
    key = i % 3 
    if key not in d: d[key] = [] 
    d[key].append(i) 

我用這條線if key not in d: d[key] = []查詢的鍵/值對存在被構造在字典中,並啓動這對。

有沒有更pythonic的方式來實現這一目標?

+0

爲什麼你不能使用數組? –

+2

['collections.defaultdict'](https://docs.python.org/2/library/collections.html#collections.defaultdict) – BrenBarn

回答

2

這可能是最好的處理defaultdict,它會自動創建任何鍵值映射,如果它尚不存在訪問。您將可調用對象傳遞給將用於初始化值的defaultdict構造函數。例如:

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> d 
defaultdict(list, {}) 
>>> d[3] 
[] 
>>> d 
defaultdict(list, {3: []}) 
0

您可以使用列表切片[啓動:停止:步] nominclature

d={} 
for i in range(3): 
    d[i] = list(range(1,10))[(i+2)%3::3] 

{0: [3, 6, 9], 
1: [1, 4, 7], 
2: [2, 5, 8]} 
1

使用理解:

>>> {n%3: list(range(n, n+7, 3)) for n in range(1,4)} 
{0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]} 

使用dict.setdefault()

>>> d = {} 
>>> for i in range(1, 10): 
...  d.setdefault(i%3, []).append(i) 
... 
>>> d 
{0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]} 

使用defaultdict

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> for i in range(1, 10): 
...  d[i%3].append(i) 
... 
>>> d 
defaultdict(<class 'list'>, {0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}) 
0
from collections import defaultdict 

d = defaultdict(list) 
for i in range(1,10): 
    key = i % 3 
    d[key].append(i) 
print(d) 

出:

defaultdict(<class 'list'>, {0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}) 

當各鍵被遇到的第一次,它尚未在 映射;因此使用 default_factory函數自動創建一個條目,該函數返回一個空列表。然後,list.append()操作將該值附加到新列表中。當再次遇到 鍵時,查找正常進行(返回 該鍵的列表),並且list.append()操作將另一個 值添加到列表中。這種技術比 等同技術使用dict.setdefault()更簡單,更快速:

>>> d = {} 
>>> for k, v in s: 
     d.setdefault(k, []).append(v) 
0

既然你沒有給任何輸入,也不可變的部分,你可能只是與你已有的文字進行初始化:

d = {1: [1,4,7], 
    2: [2,5,8], 
    0: [3,6,9]} 

如果你有變量輸入您可以使用collections.defaultdictlist的工廠。鑑於這種操作是很常見的幾個外部庫具有功能如下:

例如:

>>> from iteration_utilities import groupedby 

>>> groupedby(range(1, 10), lambda x: x % 3) 
{0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]} 

或:

>>> from toolz import groupby 

>>> groupby(lambda x: x % 3, range(1, 10)) 
{0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}