查找每个列表元素的所有组合

时间:2019-04-09 17:34:10

标签: python

提供以下列表

myList = ['A' , 'B' , 'C, D' , 'E, F, G', 'H' , 'I']

如何为列表中具有2个以上字符的每个元素获取所有可能的组合。如果可行的话,我也不想将所有元素组合在一起。

使用上述列表的示例输出如下所示:

myList = ['A' , 'B' , 'C, D' , 'E, F' , 'E, G' , 'F, G' , 'H' , 'I']

注意:我只关心查找具有两个以上字符的每个元素的组合。

我曾尝试使用itertools几次,但这似乎是要在列表中找到所有元素的所有可能组合,而不是各个部分的组合。

for L in range(0, len(myList)+1):
    for subset in itertools.combinations(myList, L):
        print(subset)

2 个答案:

答案 0 :(得分:3)

仅在拆分后具有两个以上字母的元素上使用itertools combinations

import itertools
myList = ['A' , 'B' , 'C, D' , 'E, F, G', 'H' , 'I']

result = []

for item in myList:
    item_split = item.split(',') #split each item on , separator
    if len(item_split) <= 2:
        result.append(item)
    else: #more than 2 items after splitting. use combinations
        result.extend(",".join(pair) for pair in itertools.combinations(item_split, 2))

print(result)
#Output:
['A', 'B', 'C, D', 'E, F', 'E, G', ' F, G', 'H', 'I']

答案 1 :(得分:2)

类似于Paritosh Singh's answer,但带有更多的括号:)

from operator import methodcaller
from itertools import chain, combinations

sep = ', '
splitter = methodcaller('split', sep)
def pairs(x):
    return combinations(x, 2 if len(x) > 1 else 1)
joiner = sep.join

result = list(map(joiner, 
                  chain.from_iterable(map(pairs, 
                                          map(splitter,
                                              my_list)))))

[DIGRESSION ALERT]

...如果使用Coconut,则读起来会更好:

from itertools import chain, combinations


my_list = ['A' , 'B' , 'C, D' , 'E, F, G', 'H' , 'I']

my_result = (my_list
              |> split_each
              |> pairs
              |> chain.from_iterable
              |> join_each
              |> list
             )
    where:
        split_each = map$(.split(", "))
        pairs = map$((x) -> combinations(x, 2 if len(x) > 1 else 1))
        join_each = map$(", ".join)