2016-12-18 111 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]}