有人能给我一个Python中zip()函数的例子吗?

时间:2014-09-16 00:15:13

标签: python-2.7

在Python的document中,它说明了zip函数的以下内容:

"保证了迭代的从左到右的评估顺序。这使得使用zip(* [iter(s)] * n)将数据系列聚类成n长度组的习惯成为可能。"

我很难理解zip(* [iter(s)] * n)成语。任何机构都可以举例说明我们何时应该使用这个成语?

非常感谢!

6 个答案:

答案 0 :(得分:1)

我不知道您正在使用哪些文档,但this version of zip() documentation就是这个例子:

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> zipped
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zipped)
>>> x == list(x2) and y == list(y2)
True

它按照各自的顺序将两个列表一起插入,并且还有一个"解压缩"特征

既然你问过,这里有一个更容易理解的例子:

>>> friends = ["Amy", "Bob", "Cathy"]
>>> orders = ["Burger", "Pizza", "Hot dog"]
>>> friend_order_pairs = zip(x, y)
>>> friend_order_pairs
[("Amy", "Burger"), ("Bob", "Pizza"), ("Cathy", "Hot dog")]

答案 1 :(得分:0)

zip()用于将两个或多个列表粘在一起。

names=['bob','tim','larry']

ages=[15,36,50]

zip(names,ages)

Out: [('bob', 15), ('tim', 36), ('larry', 50)]

答案 2 :(得分:0)

使用izip代替。 使用非常大的数据集时,您可以使用izip,它使用generator并仅在请求时评估结果 - 因此非常适合内存管理和更好的性能。我通常尽可能使用基于生成器的python模块变体。

想象一个像这样的例子:

from itertools import islice,izip

w = xrange(9000000000000000000)
x = xrange(2000000000000000000)
y = xrange(9000000000000000000)
z = xrange(9000000000000000000)

# The following only returns a generator that holds an iterator for the first 100 items 
# without loading that large mess of numbers into memory
first_100_items_generator = islice(izip(w,x,y,z), 100) 

# Iterate through the generator and return only what you need - first 100 items
first_100_items = list(first_100_items_generator) 

print(first_100_items)

Output:
[ (0, 0, 0, 0),
  (1, 1, 1, 1),
  (2, 2, 2, 2),
  (3, 3, 3, 3),
  (4, 4, 4, 4),
  (5, 5, 5, 5),
  (6, 6, 6, 6),
  (7, 7, 7, 7),
  (8, 8, 8, 8),
  (9, 9, 9, 9),
  (10, 10, 10, 10),
  (11, 11, 11, 11)
  ...
  ...
  ]

所以这里我有四个大数字数组,我使用izip压缩值然后使用islice来挑选前100个项目。

使用xrange,izip和islice的好处是使用生成器,因此在调用最终的“list()”方法之前它们不会被执行。

这是对生成器的一种偏离,但很高兴知道你何时开始在python中进行大数据处理。

发电机信息:

youtube

Generator intro

答案 3 :(得分:0)

当我有一个单独的键和值列表时,我用它来创建词典:

>>> keys = ('pi', 'c', 'e')
>>> values = (3.14, 3*10**8, 1.6*10**-19)
>>> dict(zip(keys, values))
{'c': 300000000, 'pi': 3.14, 'e': 1.6000000000000002e-19}

答案 4 :(得分:0)

以下是如何使用enumerate()zip()迭代两个列表及其索引:

alist = ['a1', 'a2', 'a3']
blist = ['b1', 'b2', 'b3']

for i, (a, b) in enumerate(zip(alist, blist)):
    print i, a, b

zip()基本上将两个或多个项组合在一起形成另一个相等长度的列表:

>>> alist = ['a1', 'a2', 'a3']
>>> blist = ['b1', 'b2', 'b3']
>>> 
>>> zip(alist, blist)
[('a1', 'b1'), ('a2', 'b2'), ('a3', 'b3')]
>>> 

答案 5 :(得分:0)

现在是2020年,但让我在此留作参考。

zip(*[iter(s)]*n)惯用法用于将平面列表分成多个块。

例如:

>>> mylist = [1, 2, 3, 'a', 'b', 'c', 'first', 'second', 'third']
>>> list(zip(*[iter(mylist)]*3))
[(1, 2, 3), ('a', 'b', 'c'), ('first', 'second', 'third')]

分析成语here