我有我通过迭代和附加以某种方式使得空的字典元组嵌套一个长长的清单:
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 value, keys in longlist:
但由于按键是一个迭代,以及,你可以,如果你在括号把它包起来解开它。
在没有研究太多成什么你正在尝试做的,你可以重写你的if
,如果不存在键语句不引发错误:
if dict_.get(each[1][0], {}).get(each[1][1], None):
dict_[each[1][0]][each[1][1]].append(each[0])
该dict.get
是,它如果给定的键不存在,返回一定的默认值一个非常有用的功能。
此外,它似乎你期望列表存在。 在else
块,你的意思是这样做呢?
dict_[each[1][0]][each[1][1]] = [each[0]]
这将创建一个单一的元素列表,所以现在dict[...][...].append(...)
会工作。
我也建议不要使用dict
来命名您的变量。 它阴影内置的类。
进一步改进可能包括拆包项目中的for循环的头,这样你就不必做each[0]
each[1]
依此类推。 你可以使用这样的:
for idx, pair in longlist:
x, y = pair # unpack each pair now
...
完整清单:
dict_ = {}
for idx, pair in longlist:
x, y = pair
if dict_.get(x, {}).get(y, None):
dict_[x][y].append(idx)
else:
dict_[x] = {y : [idx] }
这是比以前更具有可读性。