将键分配给元组项

时间:2014-07-30 07:42:11

标签: python

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()不应该导致任何问题......

3 个答案:

答案 0 :(得分:1)

你可以使用dict理解来编写循环python:

[{'id': id, 'name': name} for id,name in zip(l1, l2)]

根据这个dict实际上有多复杂,以及你想用它做什么,你可能想要考虑使用一个简单的类。

答案 1 :(得分:1)

ID d是您的字典,您正在执行的操作是替换字典id的键(named)的值,并且您正在追加它列表。

要创建字典列表,您可以使用列表理解,例如

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