在Python的document中,它说明了zip函数的以下内容:
"保证了迭代的从左到右的评估顺序。这使得使用zip(* [iter(s)] * n)将数据系列聚类成n长度组的习惯成为可能。"
我很难理解zip(* [iter(s)] * n)成语。任何机构都可以举例说明我们何时应该使用这个成语?
非常感谢!
答案 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中进行大数据处理。
发电机信息:
答案 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。