23

我有一个列表字典,它应该用默认键初始化。我想,下面的代码不好(我的意思是,它可以工作,但我不觉得它是用pythonic方式编写的):

d = {'a' : [], 'b' : [], 'c' : []}

所以我想使用更多的pythonic,比如defaultict

d = defaultdict(list)

但是,我看到的每个教程都会动态设置新键。但在我的情况下,所有的键都应该从一开始就定义。我正在解析其他数据结构,并且只有当结构中的特定键也包含在我的字典中时,我才会将值添加到我的字典中。

如何设置默认键?

4

5 回答 5

24

从评论中,我假设您想要一本符合以下条件的字典:

  1. 用一组键初始化,每个键都有一个空列表值
  2. 具有 defaultdict 行为,可以为不存在的键初始化一个空列表

@Aaron_lab 有正确的方法,但有一种更清洁的方法:

d = defaultdict(list,{ k:[] for k in ('a','b','c') })
于 2018-12-02T05:12:18.020 回答
16

这已经是合理的了,但是您可以通过使用标准键列表的 dict 理解来缩短它。

>>> standard_keys = ['a', 'b', 'c']
>>> d1 = {key:[] for key in standard_keys}
>>> d2 = {key:[] for key in standard_keys}
>>> ...
于 2017-03-21T05:07:57.863 回答
8

如果您要预初始化为空列表,则不需要defaultdict。简单的 dict-comprehension 可以清晰、干净地完成工作:

>>> {k : [] for k in ['a', 'b', 'c']}
{'a': [], 'b': [], 'c': []}
于 2017-03-21T05:40:15.443 回答
5

如果您有一组紧密的键(在您的示例中为 ['a', 'b', 'c'] ),您知道您会使用,那么您绝对可以使用上面的答案。

但...

dd = defaultdict(list)那么给你更多:d = {'a':[], 'b':[], 'c':[]}。您可以append在“不存在”键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)

现在你有一个 dict 保存你的 3 个键: ['a', 'b', 'c'] 和空列表作为值,也可以在不显式写入的情况下附加到其他键:d['new_key'] = []在附加之前

于 2018-04-03T19:46:32.840 回答
1

You can have a function defined which will return you a dict with preset keys.

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

于 2017-03-21T06:07:35.810 回答