2016-11-18 68 views
1

目前我的名单是:压缩函数返回重复

[[(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,名称1,player2,名称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')] 

有没有办法来改变压缩功能,使得它把前两个一个列表,然后是第二个,依此类推,但是维护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')] 

回答

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') 
+0

感谢这工作,也是我可以理解的。我也很欣赏它与我想要做的非常相似,而不是完全不同的东西。 – John

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

谢谢。我会尝试,而不是压缩它们。 – John

+0

这似乎并没有工作,因为我得到了TypeError:'int'对象没有属性'__getitem__'但感谢您的建议。 – John

1

你也可以做一个很好的小comprehen锡永:

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

感谢您的建议。但这似乎并不奏效。我得到TypeError:zip参数#1必须支持迭代我不确定是否因为我使用Python 2.7? – John

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是init ial列表中提到的问题

+0

这看起来与其他人的建议非常相似,但出于某种原因。它不适合我。我收到了关于iterable的错误。 (还是)感谢你的建议。我很高兴了解到itertools.chain() – John

+0

@John您可能不会导入链。你必须从'itertools import'链接'' –