0

我想在地图中做一个循环。我的代码是这样的:

for (abcID,bbbID) in map(abcIdList,bbbIdList):
        buildXml(abcID,bbbID)

我该怎么做才能完成这项工作?

4

2 回答 2

4

呃,我想你想要zip()...

>>> zip((1, 2), ('a', 'b'))
[(1, 'a'), (2, 'b')]
于 2012-06-25T07:03:38.780 回答
2

你混淆了map()and zip()or dict()

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_functionfrom __future__)。对于大型 dicts 和在 python2 上,iteritems()将比 快items(),因为items()首先将所有键值对放在一个列表中,而iteritems()只创建一个惰性迭代器。在 python3 上,items()已经做了类似的事情。

我希望能稍微澄清一下情况。

于 2012-06-25T07:45:31.387 回答