Python 使用2个列表生成所有可能的元素组合
假设我们有两个列表(这些列表的大小可能会有所不同): 功能=['F1','F2','F3']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
值=[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)