我想在地图中做一个循环。我的代码是这样的:
for (abcID,bbbID) in map(abcIdList,bbbIdList):
buildXml(abcID,bbbID)
我该怎么做才能完成这项工作?
呃,我想你想要zip()
...
>>> zip((1, 2), ('a', 'b'))
[(1, 'a'), (2, 'b')]
map
对可迭代对象进行操作并接受两个参数,一个函数和一个可迭代对象:
>>> def addOne(x):
... return x+1
...
>>> l = [1, 2, 3, 4]
>>> print(map(addOne, l))
[2, 3, 4, 5]
因此,它将作为第一个参数传递的函数应用于序列的每个元素,并将新序列作为列表返回(请注意,这种行为在 python3 中是不同的,你得到的是可迭代的而不是列表)。
zip()
而是做你想做的事。它采用任意数量的可迭代对象并将每个迭代步骤合并到一个元组中:
>>> l1, l2 = [1, 2, 3, 4], [5, 6, 7, 8]
>>> print(zip(l1, l2))
[(1, 5), (2, 6), (3, 7), (4, 8)]
同样,结果值是 python2 中的列表和 python3 中的迭代器。您可以像在问题中那样使用普通的 for 循环对其进行迭代。对于这样的压缩迭代器,您还可以创建一个dict
(也可以称为map,因为它将项目映射到值):
>>> d = dict(zip(l1, l2))
>>> d[1]
5
>>> d
{1: 5, 2: 6, 3: 7, 4: 8}
但是,您不能直接迭代 dicts 中的键值对:
>>> for key, value in d:
... print(key)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
这是一个相当模糊的错误消息,因为我们传递了一个dict
不是int
!到底是int
从哪里来的?默认情况下,当遍历 a 时dict
,将遍历键:
>>> list(d)
[1, 2, 3, 4]
但是我们指示 python对我们的值进行解包。所以它试图从一个 int 中获取两个值,这显然是行不通的。从这个角度来看,这个错误似乎是合理的。因此,要迭代键值对,必须使用:
>>> for key, value in d.items():
... print(key, value)
...
1 5
2 6
3 7
4 8
(输出可能会有所不同,具体取决于您是否导入了print_function
from __future__
)。对于大型 dicts 和在 python2 上,iteritems()
将比 快items()
,因为items()
首先将所有键值对放在一个列表中,而iteritems()
只创建一个惰性迭代器。在 python3 上,items()
已经做了类似的事情。
我希望能稍微澄清一下情况。