zip函数的目的是什么(如Python或C#4.0)?

Che*_*eso 13 c# python zip

有人问如何在C#中使用Python的zip?...

......这让我想问,拉链有什么用?在什么情况下我需要这个?在基类库中我需要这个是否真的如此基础?

Chr*_*heD 12

一个用例:

>>> fields = ["id", "name", "location"]
>>> values = ["13", "bill", "redmond"]
>>> dict(zip(fields, values))
{'location': 'redmond', 'id': '13', 'name': 'bill'}
Run Code Online (Sandbox Code Playgroud)

尝试不用拉链做这个...

  • dict([(fields[i], values[i]) for i in range(min(len(fields), len(values)))]) (3认同)
  • @tixxit:我不是说没有拉链是不可能的,我只是意味着不那么可读/优雅,绝对更加冗长;-) (3认同)
  • 而且,当然,如果我们概括上面的列表推导式,我们只需再次得到 zip 函数: def myzip(*args): return [tuple(args[j][i] for j in range(len(args))) for i in range(min(len(args[j]) for j in range(len(args))))] (2认同)
  • 我知道.我只是在开玩笑:) (2认同)

Aar*_*ght 11

最近有人在这里问了一个问题,我回答了Zip扩展方法,所以对某些人来说这显然很重要.;)

实际上,对于数学算法来说,这是一个相当重要的操作- 矩阵,曲线拟合,插值,模式识别等等.在数字信号处理等工程应用中也非常重要,你所做的大部分工作是组合多个信号或对它们应用线性变换 - 两者都基于样本索引,因此,拉链.压缩两个序列比基于某些键排序和连接它们要快得多,特别是当您事先知道序列具有相同数量的元素并且顺序相同时.

由于我目前的工作,我不能在这里详细说明,但总的来说,这对遥测数据也很有价值 - 工业,科学等等.通常,您将拥有来自数百或数千个点(并行源)的时间序列数据,并且您需要在设备上进行聚合,而不是水平聚合,而不是随着时间的推移.最后,您需要另一个时间序列,但需要所有单个点的总和或平均值或其他总和.

它可能听起来像SQL Server中的简单排序/组/连接(例如),但实际上很难以这种方式高效地执行.首先,时间戳可能不完全匹配,但你不关心几毫秒的差异,所以你最终必须生成一个代理键/行号和组 - 当然,代理行号只不过是你已经拥有的时间指数.压缩简单,快速,可无限并行化.

我不知道我是否称它为基础,但它很重要.我也不Reverse经常使用这种方法,但出于同样的原因,我很高兴我不必在我确实需要的时候自己写这些.

现在看起来对你有用的一个原因是.NET/C#3.5没有元组.C#4 确实有元组,当你使用元组时,压缩确实一个基本操作,因为严格执行排序.


Jef*_*ris 10

如果你想同时迭代多个迭代,zip是很有用的,这在Python中是一个相当常见的场景.

如果你有一个M by N数组,并且你想要查看列而不是行,那么zip对我来说非常方便的一个真实场景.例如:

>>> five_by_two = ((0, 1), (1, 2), (2, 3), (3, 4), (4, 5))
>>> two_by_five = tuple(zip(*five_by_two))
>>> two_by_five
((0, 1, 2, 3, 4), (1, 2, 3, 4, 5))
Run Code Online (Sandbox Code Playgroud)


Bil*_*nch 9

这是zip的常见用例:

x = [1,2,3,4,5]
y = [6,7,8,9,0]

for a,b in zip(x,y):
    print a, b
Run Code Online (Sandbox Code Playgroud)

哪个会输出:

1 6
2 7
3 8
4 9
5 0
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 7

它允许您并行处理序列,而不是顺序或嵌套.有......它有很多用途,它们目前正在逃避我.