Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从元素组合规范生成列表_Python_List_Combinations_Itertools - Fatal编程技术网

Python 如何从元素组合规范生成列表

Python 如何从元素组合规范生成列表,python,list,combinations,itertools,Python,List,Combinations,Itertools,我想使用以下表单中指定的元素组合生成一组列表: [[10, 20], [30, 40], [50, 60]] [10] [20] [10, 30] [10, 40] [20, 30] [20, 40] [10, 30, 50] [10, 30, 60] [10, 40, 50] [10, 40, 60] [20, 30, 50] [20, 30, 60] [20, 40, 50] [20, 40, 60] import itertools element_specifications =

我想使用以下表单中指定的元素组合生成一组列表:

[[10, 20], [30, 40], [50, 60]]
[10]
[20]
[10, 30]
[10, 40]
[20, 30]
[20, 40]
[10, 30, 50]
[10, 30, 60]
[10, 40, 50]
[10, 40, 60]
[20, 30, 50]
[20, 30, 60]
[20, 40, 50]
[20, 40, 60]
import itertools

element_specifications = [[10, 20], [30, 40], [50, 60]]

lists = [list(list_configuration) for list_configuration in list(itertools.product(*element_specifications))]

for list_configuration in lists:
    print(list_configuration)
这意味着第一个元素的可用值是10和20,第二个元素的可用值是30和40,依此类推(为了简洁起见,我只为每个元素使用了两个元素选项;可能不止这些)。我想使用此规范使用这些元素的组合(包括没有任何元素的可能性)生成所有列表,生成如下内容:

[[10, 20], [30, 40], [50, 60]]
[10]
[20]
[10, 30]
[10, 40]
[20, 30]
[20, 40]
[10, 30, 50]
[10, 30, 60]
[10, 40, 50]
[10, 40, 60]
[20, 30, 50]
[20, 30, 60]
[20, 40, 50]
[20, 40, 60]
import itertools

element_specifications = [[10, 20], [30, 40], [50, 60]]

lists = [list(list_configuration) for list_configuration in list(itertools.product(*element_specifications))]

for list_configuration in lists:
    print(list_configuration)
我觉得
itertools
可以用于此,但我不确定如何实现一个算法来生成这样的列表。从我上面展示的规范中生成列表的好的、通用的方法是什么(例如,不限于三个元素和三个硬编码的嵌套循环)

作为一种尝试,我有以下几点:

[[10, 20], [30, 40], [50, 60]]
[10]
[20]
[10, 30]
[10, 40]
[20, 30]
[20, 40]
[10, 30, 50]
[10, 30, 60]
[10, 40, 50]
[10, 40, 60]
[20, 30, 50]
[20, 30, 60]
[20, 40, 50]
[20, 40, 60]
import itertools

element_specifications = [[10, 20], [30, 40], [50, 60]]

lists = [list(list_configuration) for list_configuration in list(itertools.product(*element_specifications))]

for list_configuration in lists:
    print(list_configuration)
这将生成以下列表,但请注意,它忽略了由于没有元素而产生的可能性:


编辑:我提出了以下建议,但对我来说似乎很不雅观:

import itertools

element_specifications = [[10, 20], [30, 40], [50, 60]]

lists = []

for length in range(1, len(element_specifications) + 1):
    lists.extend([list(list_configuration) for list_configuration in list(itertools.product(*element_specifications[:length]))])

for list_configuration in lists:
    print(list_configuration)

您可以根据找到的解决方案创建双for循环列表理解:

>>> elements = [[10, 20], [30, 40], [50, 60]]
>>> [x for i in range(len(elements)) for x in itertools.product(*elements[:i+1])]
[(10,),
 (20,),
 (10, 30),
 (10, 40),
 (20, 30),
 (20, 40),
 (10, 30, 50),
 (10, 30, 60),
 (10, 40, 50),
 (10, 40, 60),
 (20, 30, 50),
 (20, 30, 60),
 (20, 40, 50),
 (20, 40, 60)]
或者可以使用
枚举
,稍微清理一下:

>>> [x for i, _ in enumerate(elements) for x in itertools.product(*elements[:i+1])]