如何从包含列表和字符串的嵌套列表中查找所有可能的组合?

时间:2018-02-06 04:03:33

标签: python list

我试图从列表中获取所有可能的模式,如:

input_x = ['1', ['2', '2x'], '3', '4', ['5', '5x']]

如我们所见,它在此处有2个嵌套列表['2', '2x']['5', '5x']

这意味着所有可能的模式都是4(2个案例x 2个案例),期望输出是:

output1 = ['1','2' , '3', '4',  '5']
output2 = ['1','2x', '3', '4',  '5']
output3 = ['1','2' , '3', '4', '5x']
output4 = ['1','2x', '3', '4', '5x']

我试图搜索如何,但我找不到任何示例(因为我不知道"关键字"要搜索)

我认为python有内部库/方法来处理它。

2 个答案:

答案 0 :(得分:6)

实现此目的的一种方法是使用itertools.product。但是为了使用它,您需要首先将列表中的单个元素包装到另一个列表中。

例如,首先我们需要转换您的列表:

[['1'], ['2', '2x'], ['3'], ['4'], ['5', '5x']]

为:

formatted_list = [(l if isinstance(l, list) else [l]) for l in my_list]
# Here `formatted_list` is containing the elements in your desired format, i.e.:
#    [['1'], ['2', '2x'], ['3'], ['4'], ['5', '5x']]

这可以通过以下列表理解来完成:

list

现在在上述>>> from itertools import product # v `*` is used to unpack the `formatted_list` list >>> list(product(*formatted_list)) [('1', '2', '3', '4', '5'), ('1', '2', '3', '4', '5x'), ('1', '2x', '3', '4', '5'), ('1', '2x', '3', '4', '5x')] 的解压缩版本上调用itertools.product

{{1}}

答案 1 :(得分:0)

如果您不想将列表转换为所有子列表,那么 你可以尝试这样的事情:

input_x = ['1', ['2', '2x'], '3', '4', ['5', '5x'],['6','6x']]

import itertools
non_li=[]
li=[]
for i in input_x:
    if isinstance(i,list):
        li.append(i)
    else:
        non_li.append(i)



for i in itertools.product(*li):
    sub=non_li[:]
    sub.extend(i)
    print(sorted(sub))

输出:

['1', '2', '3', '4', '5', '6']
['1', '2', '3', '4', '5', '6x']
['1', '2', '3', '4', '5x', '6']
['1', '2', '3', '4', '5x', '6x']
['1', '2x', '3', '4', '5', '6']
['1', '2x', '3', '4', '5', '6x']
['1', '2x', '3', '4', '5x', '6']
['1', '2x', '3', '4', '5x', '6x']