通过列表压缩并获取每对项目

时间:2016-07-23 01:09:31

标签: python string zip

我想压缩一个字符串列表,如下所示

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 个答案:

答案 0 :(得分: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')]