在Python中,我们都知道有一个有用的功能:zip 例如:
a = [1,2,3,4,5]
b = [5,4,3,2,1]
我们可以在一行中“添加”这些列表:
c = [ x[0] + x[1] for x in zip(a,b) ]
但似乎zip创建了一个新列表。 在许多情况下,我想要的只是一对数据(a [i],b [i]),我根本不想要“zip”列表。
在c#中,我们可以创建一个迭代器来获取a和b中的对数据,因此我们可以避免创建一个新的“zip”列表。
python怎么样?
答案 0 :(得分:5)
创建一个聚合来自每个迭代的元素的迭代器。 像zip()一样,除了它返回迭代器而不是列表。用过的 对于一次几次迭代的锁步迭代。
示例:
>>> from itertools import izip
>>> a = [1,2,3,4,5]
>>> b = [5,4,3,2,1]
>>> c = izip(a, b)
>>> c
<itertools.izip object at 0x10d1aaf38>
>>> for x, y in c:
... print x, y
...
1 5
2 4
3 3
4 2
5 1
请注意,在Python-3.x izip()
中,zip()
将返回迭代器。
答案 1 :(得分:1)
您本身并不需要功能,只需使用generator expression:
a = [1,2,3,4,5]
b = [5,4,3,2,1]
for pair in ((a[i], b[i]) for i in xrange(min(len(a), len(b)))):
print pair
输出:
(1, 5)
(2, 4)
(3, 3)
(4, 2)
(5, 1)
答案 2 :(得分:0)
您也可以在Python中创建自己的生成器:
def mygen(a, b):
"""generator yielding values from two iterables"""
aiter = iter(a)
biter = iter(b)
while True:
yield aiter.next(), biter.next()
def dyngen(*iterables):
"""generator for yielding list from dynamic number of iterables"""
iterables = map(iter, iterables)
while True:
yield map(next, iterables)
if __name__ == "__main__":
a = [1,2,3,4,5]
b = [5,4,3,2,1]
c = ["a", "b", "c", "d", "e"]
gen = mygen(a, b)
print gen.next()
print gen.next()
print gen.next()
print gen.next()
print gen.next()
print "dyngen"
gen = dyngen(a, b, c)
print gen.next()
print gen.next()
print gen.next()
print gen.next()
print gen.next()
从命令行调用:
$ python myzip.py
(1, 5)
(2, 4)
(3, 3)
(4, 2)
(5, 1)
dyngen
[1, 5, 'a']
[2, 4, 'b']
[3, 3, 'c']
[4, 2, 'd']
[5, 1, 'e']
答案 3 :(得分:-1)
尝试使用map(),如下所示:
c = map(lambda x,y:x+y,a,b)