Python zip()和zip(*)似乎给出了类似的结果

Python zip()和zip(*)似乎给出了类似的结果,python,Python,我试图理解zip()和zip(*)之间的区别 据我所知,zip()可用于组合两个列表,以便将具有共享索引的元素放在一起。例如在这些例子中: dict_list = {'First Name': ['Tom', 'Ann', 'Ben'], 'Last Name': ['Haverford', 'Perkins', 'Wyatt'], 'Age': [33, 42, 44], 'Occupation': ['Admini

我试图理解
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(*)
的行为如何

>>> dict_list.values()
[['Tom', 'Ann', 'Ben'], ['Haverford', 'Perkins', 'Wyatt'], [33, 42, 44], ['Administrator', 'Nurse', 'Auditor']]
这将返回一个包含四个子列表的列表

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

将它与您编写的第一个代码段进行比较,该代码段将
dict\u 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'],)]

func(*lst)
func(lst[0],lst[1]…,lst[-1])相同。
您刚刚编写了两种不同的方法来执行相同的操作。投票结束,因为你不清楚你在问什么。
zip(*)
在真正的zip操作之前进行解压缩,而
zip()
是直接压缩的。@wim不知何故,我在使用
zip()
zip(*)
时遇到了相同的结果,因为我希望它们表现不同。我想知道当它们被认为是相反的时候,是什么机制导致了相同的结果。那么
t
for
循环中的每个循环中,对于
zip(*)
,取什么值?我仍然对那部分感到困惑。