Skip to main content
 首页 » 编程设计

python之zip 函数返回重复项

2025年05月04日15luoye11

目前我的列表是:

[[(881, 886), ('Twilight Sparkle', 'Rainbow Dash')], 
 [(883, 885), ('Applejack', 'Rarity')],  
 
[(887, 884), ('Princess Celestia', 'Pinkie Pie')], 
 
 [(888, 882), ('Princess Luna', 'Fluttershy')]] 

我希望它具有以下格式:

   [(pid1, pname1, pid2, pname2), 
 
 (pid3, pname3, pid4, pname4),  
 
(pid5, pname5, pid6, pname6),  
 
(pid7, pname7, pid8, pname8)]  

所以是player1,name 1,player2,name 2

是在之前的 zip 函数中执行此操作并以不同的方式对其进行压缩还是现在操作列表更好。

我想做的

temp = x[1] 
x[1] = x[2] 
x[2] = x[3] 

但我不知道该怎么做。

这是压缩函数:

for i in range(0,length, 2): 
    pairs =zip(list[i],list[i+1]) 

在压缩之前它是这种格式:

[(881, 'Twilight Sparkle'), (886, 'Rainbow Dash'), 
 (883, 'Applejack'), (885, 'Rarity'),  
(887, 'Princess Celestia'), (884, 'Pinkie Pie'), 
 (888, 'Princess Luna'), (882, 'Fluttershy')] 

有没有办法更改 zip 函数,使其将前两个放在列表中,然后是第二个,依此类推,但保持 id、name、id、name 的顺序,而不是将 id 和 name 组合在一起?

我希望它采用以下格式:

[(881, 'Twilight Sparkle',886, 'Rainbow Dash'), 
 (883, 'Applejack',885, 'Rarity'),  
(887, 'Princess Celestia', 884, 'Pinkie Pie'), 
 (888, 'Princess Luna', 882, 'Fluttershy')] 

请您参考如下方法:

您可以使用 zip()与 itertools.chain()与列表理解一起作为:

from itertools import chain 
 
[tuple(chain(*zip(*item))) for item in my_list] 

返回:

[(881, 'Twilight Sparkle', 886, 'Rainbow Dash'),  
(883, 'Applejack', 885, 'Rarity'),  
(887, 'Princess Celestia', 884, 'Pinkie Pie'),  
(888, 'Princess Luna', 882, 'Fluttershy')] 

其中 my_list 是问题中提到的初始列表