如何用键初始化defaultdict?
How to initialize defaultdict with keys?
我有一个列表字典,它应该用默认键初始化。我猜,下面的代码不太好(我的意思是,它可以工作,但我不觉得它是用 pythonic 方式写的):
d = {'a' : [], 'b' : [], 'c' : []}
所以我想使用更像 pythonic 的东西,比如 defaultict
:
d = defaultdict(list)
但是,我看到的每个教程都会动态设置新密钥。但在我的例子中,所有的键都应该从一开始就定义好。我正在解析其他数据结构,并且仅当结构中的特定键也包含在我的字典中时,我才将值添加到我的字典中。
如何设置默认键?
这已经很合理了,但您可以通过使用标准键列表的字典理解来缩短它。
>>> standard_keys = ['a', 'b', 'c']
>>> d1 = {key:[] for key in standard_keys}
>>> d2 = {key:[] for key in standard_keys}
>>> ...
如果您要预初始化为空列表,则不需要 defaultdict。简单的 dict-comprehension 可以清晰干净地完成工作:
>>> {k : [] for k in ['a', 'b', 'c']}
{'a': [], 'b': [], 'c': []}
您可以定义一个函数,它将 return 您 dict
使用预设键。
def get_preset_dict(keys=['a','b','c'],values=None):
d = {}
if not values:
values = [[]]*len(keys)
if len(keys)!=len(values):
raise Exception('unequal lenghts')
for index,key in enumerate(keys):
d[key] = values[index]
return d
In [8]: get_preset_dict()
Out[8]: {'a': [], 'b': [], 'c': []}
In [18]: get_preset_dict(keys=['a','e','i','o','u'])
Out[18]: {'a': [], 'e': [], 'i': [], 'o': [], 'u': []}
In [19]:
get_preset_dict(keys=['a','e','i','o','u'],values=[[1],[2,2,2],[3],[4,2],[5]])
Out[19]: {'a': [1], 'e': [2, 2, 2], 'i': [3], 'o': [4, 2], 'u': [5]}
如果您有一组紧密的键(在您的示例中为 ['a'、'b'、'c'])
你知道你会用,你绝对可以使用上面的答案。
但是...
dd = defaultdict(list)
给你的比 d = {'a':[], 'b':[], 'c':[]}
多得多。
您可以 append
到 "not existing" 中的键 defaultdict
:
>>dd['d'].append(5)
>>dd
>>defaultdict(list, {'d': 5})
如果你这样做:
>>d['d'].append(5) # you'll face KeyError
>>KeyError: 'd'
建议这样做:
>>d = {'a' : [], 'b' : [], 'c' : []}
>>default_d = defaultdict(list, **d)
现在你有一个包含 3 个键的字典:['a'、'b'、'c'] 和空列表作为值,和 您也可以附加到其他键而无需显式写入: d['new_key'] = []
before appending
根据评论,我假设您想要一本符合以下条件的字典:
- 使用一组键进行初始化,每个键的列表值为空
- 具有可以为不存在的键初始化空列表的 defaultdict 行为
@Aaron_lab 有正确的方法,但有一个更简洁的方法:
d = defaultdict(list,{ k:[] for k in ('a','b','c') })
我有一个列表字典,它应该用默认键初始化。我猜,下面的代码不太好(我的意思是,它可以工作,但我不觉得它是用 pythonic 方式写的):
d = {'a' : [], 'b' : [], 'c' : []}
所以我想使用更像 pythonic 的东西,比如 defaultict
:
d = defaultdict(list)
但是,我看到的每个教程都会动态设置新密钥。但在我的例子中,所有的键都应该从一开始就定义好。我正在解析其他数据结构,并且仅当结构中的特定键也包含在我的字典中时,我才将值添加到我的字典中。
如何设置默认键?
这已经很合理了,但您可以通过使用标准键列表的字典理解来缩短它。
>>> standard_keys = ['a', 'b', 'c']
>>> d1 = {key:[] for key in standard_keys}
>>> d2 = {key:[] for key in standard_keys}
>>> ...
如果您要预初始化为空列表,则不需要 defaultdict。简单的 dict-comprehension 可以清晰干净地完成工作:
>>> {k : [] for k in ['a', 'b', 'c']}
{'a': [], 'b': [], 'c': []}
您可以定义一个函数,它将 return 您 dict
使用预设键。
def get_preset_dict(keys=['a','b','c'],values=None):
d = {}
if not values:
values = [[]]*len(keys)
if len(keys)!=len(values):
raise Exception('unequal lenghts')
for index,key in enumerate(keys):
d[key] = values[index]
return d
In [8]: get_preset_dict()
Out[8]:
{'a': [], 'b': [], 'c': []}
In [18]: get_preset_dict(keys=['a','e','i','o','u'])
Out[18]:
{'a': [], 'e': [], 'i': [], 'o': [], 'u': []}
In [19]:
get_preset_dict(keys=['a','e','i','o','u'],values=[[1],[2,2,2],[3],[4,2],[5]])
Out[19]:
{'a': [1], 'e': [2, 2, 2], 'i': [3], 'o': [4, 2], 'u': [5]}
如果您有一组紧密的键(在您的示例中为 ['a'、'b'、'c']) 你知道你会用,你绝对可以使用上面的答案。
但是...
dd = defaultdict(list)
给你的比 d = {'a':[], 'b':[], 'c':[]}
多得多。
您可以 append
到 "not existing" 中的键 defaultdict
:
>>dd['d'].append(5)
>>dd
>>defaultdict(list, {'d': 5})
如果你这样做:
>>d['d'].append(5) # you'll face KeyError
>>KeyError: 'd'
建议这样做:
>>d = {'a' : [], 'b' : [], 'c' : []}
>>default_d = defaultdict(list, **d)
现在你有一个包含 3 个键的字典:['a'、'b'、'c'] 和空列表作为值,和 您也可以附加到其他键而无需显式写入: d['new_key'] = []
before appending
根据评论,我假设您想要一本符合以下条件的字典:
- 使用一组键进行初始化,每个键的列表值为空
- 具有可以为不存在的键初始化空列表的 defaultdict 行为
@Aaron_lab 有正确的方法,但有一个更简洁的方法:
d = defaultdict(list,{ k:[] for k in ('a','b','c') })