l1 = [1, 2, 3]
l2 = ['foo', 'bar', 'test']
z1 = zip(l1,l2)
list(z1)
[(1, 'foo'), (2, 'bar'), (3, 'test')]
这是我的代码示例。现在我想映射(??)元组的每个值为id或name。 所以我可以得到一个结果:
[('id':1, 'name':'foo'), ('id':2, 'name':'bar'), ('id':3, 'name':'test')]
我做的是:
>>> result = []
>>> for i in zip(l1,l2):
... d['id'] = i[0]
... d['name'] = i[1]
... result.append(d)
>>> result
[{'id': 3, 'name': 'test'}, {'id': 3, 'name': 'test'}, {'id': 3, 'name': 'test'}]
但是第1次)它不起作用,而且据我所知,它根本不是pythonic ...
我不明白为什么上面的循环不起作用。如果我这样做:
>>> for i in zip(l1,l2):
... print(i[0], i[1])
...
1 foo
2 bar
3 test
它迭代每个项目没有问题,我在上面使用的append()不应该导致任何问题......
答案 0 :(得分:1)
你可以使用dict理解来编写循环python:
[{'id': id, 'name': name} for id,name in zip(l1, l2)]
根据这个dict实际上有多复杂,以及你想用它做什么,你可能想要考虑使用一个简单的类。
答案 1 :(得分:1)
ID d
是您的字典,您正在执行的操作是替换字典id
的键(name
和d
)的值,并且您正在追加它列表。
要创建字典列表,您可以使用列表理解,例如
l1 = [1, 2, 3]
l2 = ['foo', 'bar', 'test']
result = [{'id': i[0], 'name':i[1]} for i in zip(l1,l2)]
答案 2 :(得分:1)
您的解决方案无法正常工作,因为您已经超越"每一步的字典:
>>> for i in zip(l1,l2):
... d['id']=i[0]
... d['name']=i[1]
... r.append(d)
... print r
...
[{'id': 1, 'name': 'foo'}]
[{'id': 2, 'name': 'bar'}, {'id': 2, 'name': 'bar'}]
[{'id': 3, 'name': 'test'}, {'id': 3, 'name': 'test'}, {'id': 3, 'name': 'test'}]
一种方法是"重置"你在每个步骤开始时的词典:
>>> for i in zip(l1,l2):
... d={}
... d['id']=i[0]
... d['name']=i[1]
... r.append(d)
... print r
...
[{'id': 1, 'name': 'foo'}]
[{'id': 1, 'name': 'foo'}, {'id': 2, 'name': 'bar'}]
[{'id': 1, 'name': 'foo'}, {'id': 2, 'name': 'bar'}, {'id': 3, 'name': 'test'}]
但正如其他人指出的那样,[{'id': id, 'name': name} for id, name in zip(l1, l2)]
更像是pythonic。
而且我不知道你是否可以使用它,但是你可以用你的拉链来构建你的字典:
>>> dict(zip(l1, l2))
{1: 'foo', 2: 'bar', 3: 'test'}