我试图从列表中获取所有可能的模式,如:
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有内部库/方法来处理它。
答案 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']