提供以下列表
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)
答案 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)