2016-07-23 22 views
1

我想通过一个字符串列表来压缩如下邮编通过列表,并获得每对项目的

collections = [u'Room Designers', u'BCRF', u'House'] 

我想什么来实现在列表中的三个元素的6种组合 -

("Room Designers", "BCRF"), ("Room Designers", "House"), ("BCRF", "House"), ("BCRF", "Room Designers"), ("House", "BCRF"), ("House", "Room") 

下面

zipall = [zip(i,j) for i in collections for j in collections if i!=j] 

我的代码获得:

[[(u'R', u'B'), (u'o', u'C'), (u'o', u'R'), (u'm', u'F')], [(u'R', u'H'), (u'o', u'o'), (u'o', u'u'), (u'm', u's'), (u' ', u'e')], [(u'B', u'R'), (u'C', u'o'), (u'R', u'o'), (u'F', u'm')], [(u'B', u'H'), (u'C', u'o'), (u'R', u'u'), (u'F', u's')], [(u'H', u'R'), (u'o', u'o'), (u'u', u'o'), (u's', u'm'), (u'e', u' ')], [(u'H', u'B'), (u'o', u'C'), (u'u', u'R'), (u's', u'F')]] 

什么是更好的方法来做到这一点?谢谢!!

+1

你得到的单字母组合,因为你传递了两个字符串'zip',和一个字符串本身就是一个字符序列,使拉链从每根弦拉过对单个字符。 –

+0

谢谢。确实是的。我也没有意识到itertools可以如此强大! – achimneyswallow

回答

1

如果你想做到这一点你写的方式,你需要忽略最后的zip通话,因为这将打破串成他们各自的角色和配对那些起来。

zipall = [(i,j) for i in collections for j in collections if i!=j] 

# [(u'Room Designers', u'BCRF'), (u'Room Designers', u'House'), (u'BCRF', u'Room Designers'), (u'BCRF', u'House'), (u'House', u'Room Designers'), (u'House', u'BCRF')] 

对于这些类型的问题,itertools库非常方便。对于这个特定的问题,你可以使用itertools.permutations来产生2个元素的所有排列。随着排列(而不是组合),配对的顺序很重要。

import itertools 

# Create all permutations of 2 items 
output = list(itertools.permutations(collections, 2)) 

# [(u'Room Designers', u'BCRF'), (u'Room Designers', u'House'), (u'BCRF', u'Room Designers'), (u'BCRF', u'House'), (u'House', u'Room Designers'), (u'House', u'BCRF')] 
+0

谢谢。这正是我需要的。你的回答也非常全面和有益。现在我知道两天得到我想要的!谢谢!! – achimneyswallow

相关问题