从单个列表中循环遍历多个变量

时间:2011-04-11 01:13:35

标签: python

我正在尝试创建一个像这样的循环

newList = [a + b for a,b in list[::2], list[1::2]]

意思是,从列表中取两个连续的条目,对它们执行某些操作并将其放入新的列表中。

那怎么办?

3 个答案:

答案 0 :(得分:5)

您想要zip两个新创建的列表:

newList = [a + b for a,b in zip(list[::2], list[1::2])]

您还可以使用迭代器以更高效的内存方式执行此操作:

it = iter(list)
newList = [a + b for a, b in zip(it, it)]
通过使用返回迭代器的izip函数,

甚至更有效*:

import itertools
it = iter(list)
newList = [a + b for a, b in itertools.izip(it, it)]

*至少在Python 2.x下;在Python 3中,据我所知,zip本身返回一个迭代器。

注意你真的不应该调用变量list,因为这会破坏内置的list构造函数。这可能会导致混淆错误,通常被视为不良形式。

答案 1 :(得分:2)

>>> L=range(6)
>>> from operator import add
>>> map(add, L[::2], L[1::2])
[1, 5, 9]

或者你可以在这里使用迭代器

>>> L_iter = iter(L)
>>> map(add, L_iter, L_iter)
[1, 5, 9]

因为你传递了两次相同的迭代器,map()将为每次迭代消耗两个元素

另一种传递迭代器两次的方法是使用共享引用构建一个列表。这避免了临时变量

>>> map(add, *[iter(L)]*2)
[1, 5, 9]

当然,您可以使用自己的功能替换add

>>> def myfunc(a,b):
...     print "myfunc called with", a, b
...     return a+b
... 
>>> map(myfunc, *[iter(L)]*2)
myfunc called with 0 1
myfunc called with 2 3
myfunc called with 4 5
[1, 5, 9]

并且很容易扩展到3个或更多变量

>>> def myfunc(*args):
...     print "myfunc called with", args
...     return sum(args)
... 
>>> map(myfunc, *[iter(L)]*3)
myfunc called with (0, 1, 2)
myfunc called with (3, 4, 5)
[3, 12]

答案 2 :(得分:1)

Zip和Map在这里派上用场。

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> list(zip(a, b))
[(1, 4), (2, 5), (3, 6)]
>>> list(map <operation>, (zip(a, b)))
>>> ...

或者在你的情况下,

>>> list(map(lambda n: n[0] + n[1], (zip(a, b))))
[5, 7, 9]

肯定有更好的方法将加号操作传递给地图。任何人都可以随意添加!