簡體   English   中英

初始化字典的大多數pythonic方法

[英]Most pythonic way to initialize a dict

假設我有一個這樣的字典

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] = []以檢查在字典的鍵/值對存在並開始對。

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

這可能最好用defaultdict處理,如果沒有的話,它將自動創建任何可以訪問的鍵值映射。 您將一個callable傳遞給defaultdict構造函數,該構造函數將用於初始化該值。 例如:

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

使用理解:

>>> {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]})

您可以使用列表切片[start:stop:step]術語

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]}
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)

假設您沒有輸入任何內容,也沒有提供可變部分,則可以使用已有的文字對其進行初始化:

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]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM