有没有一个功能可以取代" zip" Python中的函数?

时间:2014-05-09 16:12:01

标签: python list iterator zip

在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怎么样?

4 个答案:

答案 0 :(得分:5)

itertools.izip()

  

创建一个聚合来自每个迭代的元素的迭代器。   像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)