给出这两个清单:
I[2]: list1 = ['r1', 'r1', 'r1', 'r2', 'r2', 'r3']
I[3]: list2 = [1,2,3,1,2,1]
构造以下字典的Pythonic方法是什么?
I[5]: mydict
O[5]: {'r1': {'n1': 1, 'n2': 2, 'n3': 3}, 'r2': {'n1': 1, 'n2': 2}, 'r3': 'n1'}
感谢。
答案 0 :(得分:4)
l1 = ['r1', 'r1', 'r1', 'r2', 'r2', 'r3']
l2 = [1, 2, 3, 1, 2, 1]
d = {}
for i, j in zip(l1, l2):
d[i] = d.get(i, {})
d[i]['n%s' % j] = j
可替换地:
l1 = ['r1', 'r1', 'r1', 'r2', 'r2', 'r3']
l2 = [1, 2, 3, 1, 2, 1]
d = dict((i, {}) for i in set(l1))
for i, j in zip(l1, l2):
d[i]['n%s' % j] = j
答案 1 :(得分:1)
不完全过于pythonic,有人可以改进:
l1 = ["r1", "r1", "r1", "r2", "r2", "r3"]
l2 = [1,2,3,1,2,1]
d = {}
for i in xrange(len(l1)):
v = d.get(l1[i], {})
v["n" + str(l2[i])] = l2[i]
d[l1[i]] = v
print d
答案 2 :(得分:1)
我会分两步完成它,首先创建你的dicts字典,每个k都是来自list1
的元素,并带有相关的空字典。
d = dict((k, {}) for k in list1)
使用list1
对enumerate
进行迭代,以获取list2
中项目的索引,并更新正确的字典。
for i, k in enumerate(list1):
d[k]['n%d' % list2[i]] = list2[i]
或者更好地使用zip来同时获得关键和正确的值(如bluepnume的答案):
for k, v in zip(list1, list2):
d[k]['n%d' % v] = v
答案 3 :(得分:0)
使用defaultdict:
from collections import defaultdict
list1 = ['r1', 'r1', 'r1', 'r2', 'r2', 'r3']
list2 = [1,2,3,1,2,1]
mydict = defaultdict(dict)
for a, b in zip(list1, list2):
mydict[a]['n%s' %b] = b