簡體   English   中英

Python:為嵌套字典中的一個鍵附加多個值

[英]Python: Append Multiple Values for One Key in Nested Dictionary

我有以下元組列表:

p = [("01","Master"),("02","Node"),("03","Node"),("04","Server")]

我希望我的輸出看起來像:

y = {
     "Master":{"number":["01"]},
     "Node":{"number":["02", "03"]},
     "Server":{"number":["04"]}
     }

我嘗試了以下代碼:

y = {}
for line in p:
     if line[1] in y:
          y[line[1]] = {}
          y[line[1]]["number"].append(line[0])
     else:
          y[line[1]] = {}
          y[line[1]]["number"] = [line[0]]

我得到以下錯誤:

 Traceback (most recent call last):
         File "<stdin>", line 4, in <module>
 KeyError: 'number'

我該如何解決?

from collections import defaultdict

d = defaultdict(lambda: defaultdict(list))
for v, k in p:
    d[k]["number"].append(v)


print(d)

  defaultdict(<function <lambda> at 0x7f8005097578>, {'Node': defaultdict(<type 'list'>, {'number': ['02', '03']}), 'Master': defaultdict(<type 'list'>, {'number': ['01']}), 'Server': defaultdict(<type 'list'>, {'number': ['04']})})

沒有defaultdict:

d = {}
from pprint import pprint as pp
for v, k in p:
    d.setdefault(k,{"number":[]})
    d[k]["number"].append(v)


pp(d)

{'Master': {'number': ['01']},
 'Node': {'number': ['02', '03']},
 'Server': {'number': ['04']}}

當y中已經存在key時,請勿將{}分配給key。

y = {}
for line in p:
     try:
          y[line[1]]["number"].append(line[0])
     except:
          y[line[1]] = {}
          y[line[1]]["number"] = [line[0]]

或使用defaultdict使用:-

>>> from collections import defaultdict
>>> p = [("01","Master"),("02","Node"),("03","Node"),("04","Server")]
>>> d = defaultdict(list)
>>> for k, v in p:
...    d[v].append(k)
... 
>>> d
defaultdict(<type 'list'>, {'Node': ['02', '03'], 'Master': ['01'], 'Server': ['04']})

這是因為您不需要在需要時初始化字典,而是在不需要時將其重置。

嘗試這個:

p = [("01","Master"),("02","Node"),("03","Node"),("04","Server")]

y = {}
for (number, category) in p:
    if not y.get(category, False):
        # initializes your sub-dictionary
        y[category] = {"number": []}

    # adds the correct number to the sub-dictionary
    y[category]["number"].append(number)

請注意, for (number, category) in p使用元組解包可以使您的代碼在循環內更具可讀性。

您正在重置字典!

for line in p:
     if line[1] in y:
          #y[line[1]] = {}   -- RESET! ["number"] will now disappear.
                               #.. which leads to error in the next line.
          y[line[1]]["number"].append(line[0])
     else:
          y[line[1]] = {}
          y[line[1]]["number"] = [line[0]]

實現相同目標的更Python方式是使用defaultdict如其他答案所示。

暫無
暫無

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

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