python - 如何在python中递归创建排列列表?
问题描述
我有一个字典possibilities
,其中键是索引,该键的值是可以位于列表中该索引的值。见下文:
possibilities = {0: [None, 'KLAX_1', 'KDEN_1'],
1: [None, 'KLAX_1', 'KDEN_1'],
2: [None, 'KLAX_1', 'KLAS_1', 'KDEN_1'],
3: [None, 'KLAX_1', 'KLAS_1', 'KPHX_1', 'KDEN_1', 'KDFW_1'],
4: [None, 'KPHX_1', 'KDEN_2', 'KDFW_2'],
5: [None, 'KDEN_2', 'KDFW_2'],
6: [None, 'KDEN_2']}
我想将此列表的每个排列保存在另一个名为permutations_list
. 我的目标是从可能性字典创建这个 permutations_list。目前我有一个巨大的嵌套 for 循环来构建它(见下文)。但我希望有一个函数可以possibilities_dict
自动接收并生成我的列表。我在想递归函数将允许我不指定我需要的索引数量。
for index_0 in possibilities[0]:
for index_1 in possibilities[1]:
for index_2 in possibilities[2]:
for index_3 in possibilities[3]:
for index_4 in possibilities[4]:
for index_5 in possibilities[5]:
for index_6 in possibilities[6]:
lst = [index_0,index_1,index_2,index_3,index_4,index_5,
index_6]
permutations_list.append(lst)
上面代码的结果是一个permutations_list
长度列表5184
。该列表中的每个项目都是一个列表,其中包含所有值的特定排列。这不像使用itertools.permutations
只有特定值可以位于列表中的特定索引处那样简单。任何人都可以帮助提供递归函数吗?谢谢。
解决方案
经过一些编码后,我想出了一个递归解决方案。您可以使用itertools.product
或以下功能。
def rec_permutations(possibilities):
counter = 0
permutations_list=[]
lst=[]
return rec_permutations_helper(possibilities, permutations_list, counter, lst)
def rec_permutations_helper(possibilities, permutations_list, counter, lst):
# Base case
if counter == len(possibilities):
permutations_list.append(lst)
return
# Recursive case
else:
locations = possibilities[counter]
for location in locations:
new_lst = lst + [location]
rec_permutations_helper(possibilities, permutations_list, counter+1, new_lst)
return permutations_list
推荐阅读
- php - 将 postgresql 数据库连接到 codeigniter
- django - 使用 DRF 发布 GeoJSON 会导致“函数 st_geomfromewkb(bytea) 不存在”
- excel - VBA 自动化 - 预填充组合框
- javascript - 从数组中克隆或复制对象,然后使用 es6 推送和重命名
- javascript - 在发布版本中未调用 ChartJs beforeDraw 方法
- python - 制作 tf.function 的任何漂亮方法都包含类实例值?
- javascript - 在 Java 中加载其 javascript init 方法后获取 HTML 文件
- java - Javafx Webview 问题由以下原因引起:javafx.fxml.LoadException:
- glibc - make glibc 2.14 期间“__readlink”的类型冲突
- java - Java中的布尔逻辑表达式