将项目分为两个列表

时间:2011-05-15 17:20:09

标签: python

给出这两个清单:

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'}

感谢。

4 个答案:

答案 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)

使用list1enumerate进行迭代,以获取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