zip函数返回重复

时间:2016-11-18 20:41:45

标签: python python-2.7

目前我的名单是:

[[(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]

但我不知道该怎么办。

这是zip函数:

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')]

4 个答案:

答案 0 :(得分:3)

您可以将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是问题中提到的初始列表

答案 1 :(得分:1)

列表推导可能是一种更好的方法:

[(item[0][0], item[1][0], item[0][1], item[1][1]) for item in l]

所以对你的例子

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

你会得到

players_reformatted = [(item[0][0], item[1][0], item[0][1], item[1][1]) for item in players]

给出了

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

答案 2 :(得分:1)

看起来你根本不想要压缩,你只想连接成对的元组:

players = [(881, 'Twilight Sparkle'), (886, 'Rainbow Dash'),
           (883, 'Applejack'), (885, 'Rarity'),
           (887, 'Princess Celestia'), (884, 'Pinkie Pie'),
           (888, 'Princess Luna'), (882, 'Fluttershy')]
pairs = [players[i] + players[i + 1] for i in range(0, len(players), 2)]
for pair in pairs:
    print(pair)

输出:

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

答案 3 :(得分:1)

你也可以用一点点理解来做到这一点:

>>> r = [sum(zip(*sub), ()) for sub in l]

使用zip解压缩zip(*sub)中的内容,然后展平使用sum(iterable, ())创建的嵌套元组。

这会产生:

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