[英]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.defaultdict
与list
作为工厂一起使用。 鉴于此操作非常常见,因此一些外部库具有以下功能:
例如:
>>> 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.