我试图了解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(*)
似乎将具有共享索引的所有元素放在同一元组中。这与第一个代码没有什么不同,在第一个代码中,我在zip()
循环中使用了for
,并向其中传递了dict键和相应的循环变量
在这种情况下zip()
和zip(*)
的行为如何?
答案 0 :(得分:2)
>>> dict_list.values()
[['Tom', 'Ann', 'Ben'], ['Haverford', 'Perkins', 'Wyatt'], [33, 42, 44], ['Administrator', 'Nurse', 'Auditor']]
这将返回一个包含四个子列表的列表。
zip(*dict_list.values())
这将解压缩该列表并将每个元素作为单独的参数传递给zip()
。这就是*
拆包运算符的作用:如果您用包含四个元素的列表zip(*l)
调用l
,它将使用这四个参数调用zip()
。
将其与您编写的第一个代码段进行比较,该代码段将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'],)]