简体   繁体   English

Python:为嵌套字典中的一个键附加多个值

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

I have the below list of tuples: 我有以下元组列表:

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

I want my output to look like: 我希望我的输出看起来像:

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

I have tried the below code: 我尝试了以下代码:

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

And I get the below error: 我得到以下错误:

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

How do I solve this? 我该如何解决?

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

without defaultdict: 没有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']}}

Do not assign {} to key when key is already present in y. 当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]]

OR Use defaultdict use:- 或使用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']})

It's because you don't initialize your dictionary when needed, and you reset it when not needed. 这是因为您不需要在需要时初始化字典,而是在不需要时将其重置。

Try this: 尝试这个:

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)

Note that using a tuple unpacking for (number, category) in p allows your code to be more readable inside your loop. 请注意, for (number, category) in p使用元组解包可以使您的代码在循环内更具可读性。

You are resetting the dictionary! 您正在重置字典!

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

A more pythonic way of achieving the same thing would be by using a defaultdict as demonstrated in other answers. 实现相同目标的更Python方式是使用defaultdict如其他答案所示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM