Python 使用2个列表生成所有可能的元素组合

Python 使用2个列表生成所有可能的元素组合,python,data-structures,Python,Data Structures,假设我们有两个列表(这些列表的大小可能会有所不同): 功能=['F1','F2','F3'] 值=[0,1] 我想得到任何可能大小的所有可能组合(用图像表示): 其思想是获得所有节点(F1_0,F1_0,F2_0…)内所示的组合。目前,我已尝试使用递归: features = ['F1', 'F2', 'F3'] query = '' values = [0, 1] def datatree(query,features): if features: feature

假设我们有两个列表(这些列表的大小可能会有所不同):

功能=['F1','F2','F3']
值=[0,1]

我想得到任何可能大小的所有可能组合(用图像表示):

其思想是获得所有节点(F1_0,F1_0,F2_0…)内所示的组合。目前,我已尝试使用递归:

features = ['F1', 'F2', 'F3']
query = ''
values = [0, 1]

def datatree(query,features):
    if features:
        feature = features.pop(0)
        query+= feature
        for i in values:
            datatree(query+ '_' + str(i)+' ', features)
    else:
        print(query)

datatree(query, features)
但是我没有正确地设计它,因为当它到达F1\u0 F2\u1并且必须继续时,特性是空的(我不理解这一点,因为在该子例程中堆栈应该仍然有F3,对吗?)


您认为还有其他方法可以帮助我吗?或者我不理解的东西吗?

原因是您只使用了一个列表作为
功能。由于
feature
因此是,例如,当您到达堆栈的末尾
F_3
并返回一个级别时,元素
F_3
已经弹出,并且在下次将其传递到
datatree
时不在
feature

要修复此问题,在调用数据树时需要传入
功能的副本

from copy import copy
features = ['F1', 'F2', 'F3']
query = ''
values = [0, 1]

def datatree(query,features):
    if features:
        feature = features.pop(0)
        query+= feature
        for i in values:
            datatree(query+ '_' + str(i)+' ', copy(features))
    else:
        print(query)

datatree(query, features)
给出:

F1_0 F2_0 F3_0 
F1_0 F2_0 F3_1 
F1_0 F2_1 F3_0 
F1_0 F2_1 F3_1 
F1_1 F2_0 F3_0 
F1_1 F2_0 F3_1 
F1_1 F2_1 F3_0 
F1_1 F2_1 F3_1

使用
itertools.product(值,repeat=len(特征))
生成可能的值排列,例如
[0,0,0],[0,0,1],…,[1,1,1]

然后使用列表理解将该值作为后缀应用于相应位置的特征。我们使用
zip
——即
zip(['F1',F2',[0,1])
返回一个
[('F1',0),('F2',1)]
的iterable

来自itertools导入产品的

def数据树(功能、值):
值\组合=产品(值,重复=长度(特征))
返回[
“”加入(
f“{feature}{value}”表示功能,值在zip中(功能,组合)
)
用于值组合中的组合
]
特征=['F1'、'F2'、'F3']
值=[0,1]
#返回['F1_0 F2_0 F3_0','F1_0 F2_0 F3_1','F1_0 F2_1 F3_0','F1_1 F2_0 F3_0','F1_1 F2_0 F3_1','F1_1 F2_1 F3_0','F1_1 F2_1 F3_1']
数据树(特性、值)

感谢所有回答这个问题的人,我能够获得所有节点的内容。以下是您需要的最终代码:

features = ['F1', 'F2', 'F3']
values = [0, 1]
query=''

def datatree(query,features,feature_index):
    print(query)
    if feature_index<len(features):
        query += features[feature_index]
        for i in values:
            datatree(query+ '_' + str(i)+' ', features, feature_index+1)
datatree(query, features,0)
features=['F1',F2',F3']
值=[0,1]
查询=“”
def数据树(查询、要素、要素索引):
打印(查询)

如果feature\u Index调用函数后检查features的值,看看哪里出了问题。提示:除非你知道自己在做什么,否则不要把递归和变异混为一谈。@MisterMiyagi你是个天才!!非常感谢你的提示。出于某种原因,在我脑海中F2_1中的列表仍然有F3,这就是为什么我感到如此沮丧。非常感谢您对通过引用传递的变量的解释!这正是我对这个问题不了解的主要原因。对于回复,我了解了很多,这也解决了问题!
features = ['F1', 'F2', 'F3']
values = [0, 1]
query=''

def datatree(query,features,feature_index):
    print(query)
    if feature_index<len(features):
        query += features[feature_index]
        for i in values:
            datatree(query+ '_' + str(i)+' ', features, feature_index+1)
datatree(query, features,0)