繁体   English   中英

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

[英]Find all combinations of each individual list element

给出以下列表

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)

拆分后,仅对两个以上字母的元素使用itertools组合

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']

Paritosh Singh的答案类似,但带有更多的括号:)

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)))))

[发布警告]

...可以说,如果您使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM