zip() 和 zip(*) 似乎给出了相似的结果[重复]

Posted

技术标签:

【中文标题】zip() 和 zip(*) 似乎给出了相似的结果[重复]【英文标题】:zip() and zip(*) seem to give similar results [duplicate] 【发布时间】:2019-08-04 11:47:39 【问题描述】:

我试图了解zip()zip(*) 之间的区别。

据我了解,zip() 可用于组合两个列表,以便具有共享索引的元素在一起。比如在这些例子中:

dict_list = 'First Name': ['Tom', 'Ann', 'Ben'],
             'Last Name': ['Haverford', 'Perkins', 'Wyatt'],
             'Age': [33, 42, 44],
             'Occupation': ['Administrator', 'Nurse', 'Auditor']

for first_name, last_name, age, occupation in zip(dict_list['First Name'], dict_list['Last Name'], dict_list['Age'], dict_list['Occupation']):
             print(first_name, last_name, age, occupation)

#result    

Tom Haverford 33 Administrator
Ann Perkins 42 Nurse
Ben Wyatt 44 Auditor

那么在我看来,为什么有时 zip(*) 会以这种方式运行?例如:

for t in (zip(*dict_list.values())):
    print(t)
#result    

('Tom', 'Haverford', 33, 'Administrator')
('Ann', 'Perkins', 42, 'Nurse')
('Ben', 'Wyatt', 44, 'Auditor')

由于我的dict_list.values() 是列表,因此zip(*) 似乎将所有具有共享索引的元素放在同一个元组中。这与第一个代码没有太大区别,我在 for 循环中使用了zip(),其中传入了dict键并带有相应的循环变量

zip()zip(*) 在这种情况下表现如何?

【问题讨论】:

func(*lst)func(lst[0], lst[1] ... , lst[-1]) 相同 你刚刚写了两种不同的方法来做同样的事情。投票结束,因为不清楚你在问什么。 zip(*) 在真正的 zip 操作之前进行解包,而 zip() 是直接 zip。 @wim 不知何故,当我期望它们表现不同时,我在使用 zip()zip(*) 时遇到了相同的结果。而且我想知道导致相同结果的机制是什么,而它们应该是相反的。 【参考方案1】:
>>> dict_list.values()
[['Tom', 'Ann', 'Ben'], ['Haverford', 'Perkins', 'Wyatt'], [33, 42, 44], ['Administrator', 'Nurse', 'Auditor']]

这将返回一个包含四个子列表的列表。

zip(*dict_list.values())

这会解压该列表并将每个元素作为单独的参数传递给zip()。这就是 * 解包运算符的作用:如果您使用包含四个元素的列表 l 调用 zip(*l),它会使用这四个参数调用 zip()

将其与您编写的第一个 sn-p 进行比较,它将 dict_list 中的四个列表作为单独的参数传递给 zip

zip(dict_list['First Name'], dict_list['Last Name'], dict_list['Age'], dict_list['Occupation'])

他们最终都将完全相同的东西传递给zip()。结果自然是一样的。


如果您想将其与没有* 的版本进行比较,请尝试:

zip(dict_list.values())

现在有区别了:

>>> zip(*dict_list.values())
[('Haverford', 'Tom', 33, 'Administrator'), ('Perkins', 'Ann', 42, 'Nurse'), ('Wyatt', 'Ben', 44, 'Auditor')]
>>> zip(dict_list.values())
[(['Haverford', 'Perkins', 'Wyatt'],), (['Tom', 'Ann', 'Ben'],), ([33, 42, 44],), (['Administrator', 'Nurse', 'Auditor'],)]

【讨论】:

tfor 循环与zip(*) 的每个循环中取什么值?我仍然对那部分感到困惑。

以上是关于zip() 和 zip(*) 似乎给出了相似的结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Zip Mime 类型似乎无法识别

Golang 存档/zip 产生损坏的 zip 文件

zip()和*zip()

使用 Python 下载 zip 文件给出 HTTP 403

使用 python ftplib 下载二进制格式的 zip 文件

PHP 即时创建和下载 ZIP