Jos*_* K. 1 python dictionary nested tuples list
我有一个很长的嵌套元组列表,我正在迭代并以某种方式附加,以便空字典:
dict = {}
Run Code Online (Sandbox Code Playgroud)
将填写如下:
dict = {a: {b:1,5,9,2,3}, b: {c:7,4,5,6,2,4}, c: {b:3,13,2,4,2}... }
Run Code Online (Sandbox Code Playgroud)
迭代将检查嵌套字典是否存在,如果存在,则它将附加值,否则,创建嵌套字典.我糟糕的尝试看起来像这样:
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]
Run Code Online (Sandbox Code Playgroud)
我的方法的问题是迭代失败,因为字典开头是空的,或者在dict中不存在嵌套的父级.对我来说这很复杂.我无法在网上找到关于如何处理嵌套词典的大量信息,所以我认为在这里问一下应该没问题.
这是一个使用的解决方案 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
Run Code Online (Sandbox Code Playgroud)
一般来说,我改变你的代码的方式是首先确保存在嵌套的字典(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)
Run Code Online (Sandbox Code Playgroud)
也不是for line vs"for each ..."这是解压缩iterable中的项目.你也可以做到
for value, keys in longlist:
Run Code Online (Sandbox Code Playgroud)
但由于键也是可迭代的,如果将它包装在parens中,也可以将其解压缩.
| 归档时间: |
|
| 查看次数: |
2260 次 |
| 最近记录: |