是否可以使用 setdefault 将嵌套字典附加到列表中?
Is it possible to have nested dictionary using setdefault, appending to a list?
我想要一个嵌套字典,其中包含附加到子键的值列表。获取子键无法识别
month = {}
for row in date:
month.setdefault(row[1],{row[0]: []})
month[row[0]].append(row[4])
print(month[main_key][sub_key])
我希望通过附加方法填充一个值列表。但是,我不断收到 keyError。
期望的输出:
{'row[1]': {'row[0]' :[row[4], row[4], row[4]],
'row[0]' :[row[4], row[4], row[4]]}}
让我们按照 for 循环块中的语句进行操作。
第一个是:
month.setdefault(row[1], {row[0]: []})
这将为键 row[1]
设置值 {row[0]: []}
(dictionary),其中键尚未插入 month
.
下一条语句是:
month[row[0]].append(row[4])
它将 row[4]
附加到使用键 row[0]
从 month
检索到的列表。
考虑到即使键存在于 month
中,与它配对的值也是一个 字典 而不是一个列表,这一行应该是错误的。
那一行应该写成:
month[row[1]][row[0]].append(row[4])
month[row[1]]
检索与键 row[1]
配对的 字典 ,然后对其进行索引以访问与 row[0]
.[=23 配对的列表=]
这是我认为您要实现的目标的简单示例:
>>> rows = [[1,2,3], [1,2,4], [1,3,3], [1,3,5], [2,3,9], [2,3,5]]
>>> ret = {}
>>> for row in rows:
... ret.setdefault(row[0], {}).setdefault(row[1], []).append(row[2])
...
>>> ret
{1: {2: [3, 4], 3: [3, 5]}, 2: {3: [9, 5]}}
它是如何工作的?对于每个 row
:
- 我们在
ret
键中寻找row[0]
。如果它不存在,我们将 (row[0], {})
对添加到字典中, {}
是嵌套字典。它存在,我们继续。
- 值
row[1]
是嵌套字典的键。我们在ret[row[0]]
(第一个setdefault
return)中寻找它:如果它不存在,我们添加一个空列表。
- 我们将值
row[2]
添加到列表 ret[row[0]][row[1]]
记住:
ret.setdefault(row[0], value_if_absent).func()
表示:
if row[0] not in ret:
ret[row[0]] = value_if_absent
ret[row[0]].func()
通常,value_if_absent
是一个容器,而 func
是 append
、extend
、update
、...方法之一。但是 func
也可能是 setdefault
以在需要时创建新容器。
我想要一个嵌套字典,其中包含附加到子键的值列表。获取子键无法识别
month = {}
for row in date:
month.setdefault(row[1],{row[0]: []})
month[row[0]].append(row[4])
print(month[main_key][sub_key])
我希望通过附加方法填充一个值列表。但是,我不断收到 keyError。
期望的输出:
{'row[1]': {'row[0]' :[row[4], row[4], row[4]],
'row[0]' :[row[4], row[4], row[4]]}}
让我们按照 for 循环块中的语句进行操作。
第一个是:
month.setdefault(row[1], {row[0]: []})
这将为键 row[1]
设置值 {row[0]: []}
(dictionary),其中键尚未插入 month
.
下一条语句是:
month[row[0]].append(row[4])
它将 row[4]
附加到使用键 row[0]
从 month
检索到的列表。
考虑到即使键存在于 month
中,与它配对的值也是一个 字典 而不是一个列表,这一行应该是错误的。
那一行应该写成:
month[row[1]][row[0]].append(row[4])
month[row[1]]
检索与键 row[1]
配对的 字典 ,然后对其进行索引以访问与 row[0]
.[=23 配对的列表=]
这是我认为您要实现的目标的简单示例:
>>> rows = [[1,2,3], [1,2,4], [1,3,3], [1,3,5], [2,3,9], [2,3,5]]
>>> ret = {}
>>> for row in rows:
... ret.setdefault(row[0], {}).setdefault(row[1], []).append(row[2])
...
>>> ret
{1: {2: [3, 4], 3: [3, 5]}, 2: {3: [9, 5]}}
它是如何工作的?对于每个 row
:
- 我们在
ret
键中寻找row[0]
。如果它不存在,我们将(row[0], {})
对添加到字典中,{}
是嵌套字典。它存在,我们继续。 - 值
row[1]
是嵌套字典的键。我们在ret[row[0]]
(第一个setdefault
return)中寻找它:如果它不存在,我们添加一个空列表。 - 我们将值
row[2]
添加到列表ret[row[0]][row[1]]
记住:
ret.setdefault(row[0], value_if_absent).func()
表示:
if row[0] not in ret:
ret[row[0]] = value_if_absent
ret[row[0]].func()
通常,value_if_absent
是一个容器,而 func
是 append
、extend
、update
、...方法之一。但是 func
也可能是 setdefault
以在需要时创建新容器。