我有一长串嵌套元组,我正在迭代并以某种方式追加,这样一个空字典:
dict = {}
将像这样填充:
dict = {a: {b:1,5,9,2,3}, b: {c:7,4,5,6,2,4}, c: {b:3,13,2,4,2}... }
迭代将检查是否存在嵌套字典,如果存在,则附加值,否则创建嵌套字典。我糟糕的尝试看起来像这样:
longlist = [(1,(a,b)),(2,(b,c)), (3,(c,b)) ... ]
dict = {}
for each in longlist:
if dict[each[1][0]][each[1][1]]:
dict[each[1][0]][each[1][1]].append(each[0])
else:
dict[each[1][0]] = {}
dict[each[1][0]][each[1][1]] = each[0]
我的方法的问题是迭代失败,因为字典一开始是空的,或者嵌套的父项在字典中不存在。对我来说越来越复杂了。我无法在网上找到很多关于如何处理嵌套字典的信息,所以我认为在这里提问应该没问题。
请您参考如下方法:
这是一个使用 collections.defaultdict 的解决方案
import random
import collections
choices = ['a', 'b', 'c', 'd', 'e', 'f']
longlist = []
for i in range(1, 101):
longlist.append((i, tuple(random.sample(choices, 2))))
print longlist
final = collections.defaultdict(lambda: collections.defaultdict(list))
for value, (key1, key2) in longlist:
final[key1][key2].append(value)
print final
一般来说,我更改您的代码的方法是首先确保嵌套字典存在(collections.defaultdict 会为您处理),然后始终追加一次。
有点像
for value (key1, key2) in longlist:
if not your_dict.get(key1):
your_dict[key1] = {}
if not your_dict.get(key1).get(key2):
your_dict[key1][key2] = []
your_dict[key1][key2].append(value)
也不是 for line vs "for each ..."这是解包 iterable 中的项目。你也可以这样做
for value, keys in longlist:
但由于 keys 也是一个可迭代对象,因此如果将其包装在括号中,也可以将其解包。
