簡體   English   中英

如何用鍵初始化defaultdict?

[英]How to initialize defaultdict with keys?

我有一個列表字典,它應該用默認密鑰初始化。 我猜,下面的代碼不好(我的意思是,它有效,但我覺得它不是用pythonic方式編寫的):

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

所以我想使用像ictict更像defaultict東西:

d = defaultdict(list)

但是,我見過的每個教程都會動態設置新密鑰。 但在我的情況下,所有的鍵都應該從一開始就定義。 我正在解析其他數據結構,只有當結構中的特定鍵也包含在我的字典中時,才會向我的字典添加值。

如何設置默認密鑰?

這已經是合理的,但你可以通過使用標准鍵列表的字典理解來縮短一點。

>>> standard_keys = ['a', 'b', 'c']
>>> d1 = {key:[] for key in standard_keys}
>>> d2 = {key:[] for key in standard_keys}
>>> ...

如果您有一組密切的鍵(在您的示例中為['a','b','c']),您知道您將使用,您絕對可以使用上面的答案。

但...

dd = defaultdict(list)為您提供更多: d = {'a':[], 'b':[], 'c':[]} 您可以在defaultdict append “not existing”鍵:

>>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'] = []在追加之前

如果您要預先初始化為空列表,則不需要defaultdict 簡單的字典理解能夠清晰,干凈地完成工作:

>>> {k : [] for k in ['a', 'b', 'c']}
{'a': [], 'b': [], 'c': []}

從評論中,我假設你想要一個符合以下條件的字典:

  1. 使用一組鍵進行初始化,每個鍵都有一個空列表值
  2. 具有defaultdict行為,可以為不存在的鍵初始化空列表

@Aaron_lab有正確的方法,但有一個稍微清晰的方法:

d = defaultdict(list,{ k:[] for k in ('a','b','c') })

您可以定義一個函數,它將返回帶有預設鍵的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

在[8]中:get_preset_dict()

Out [8]: {'a': [], 'b': [], 'c': []}

在[18]中:get_preset_dict(keys = ['a','e','i','o','u'])

Out [18]: {'a': [], 'e': [], 'i': [], 'o': [], 'u': []}

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

暫無
暫無

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

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