我正在尝试创建一个像这样的循环
newList = [a + b for a,b in list[::2], list[1::2]]
意思是,从列表中取两个连续的条目,对它们执行某些操作并将其放入新的列表中。
那怎么办?
答案 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]
肯定有更好的方法将加号操作传递给地图。任何人都可以随意添加!