python - 通过进行 N 次交换生成所有可能的组合
问题描述
我有一个列表列表([[a,b,c],[d,e,f],[g,h,i]...]).
我试图通过在当前状态上进行 N 次交换,将列表中的一个项目与另一个列表中的一个项目交换,从而生成从该状态可到达的所有可能列表。
例如 - 用 d 交换 a,用 e 交换 b,用 g 交换 f(注意我们正在寻找从这个状态可能的 N 交换)
但是,我不想执行实际的交换,而是生成一个交换指令列表,其中还包括sublist
.
因此,N=3 的示例输出将是:
((1: a, 2: d), (1: b, 2: e), (1: c, 2: f))
(意思是 a froml1
与 d froml2
交换, b froml1
与 e froml2
交换, c froml1
与 f from交换l2
)
((1: a, 2: e), (1: b, 2: d), (1: c, 2: f))
((1: a, 3: g), (1: b, 3: h), (1: c, 3: i))
etc..
但是,最大的问题是 - 请注意第一个交换指令和第二个交换指令将导致相同的 list,我不确定如何有效地识别和消除这种情况。
现在我正在使用一个非常愚蠢的递归函数,它不能区分交换是否已经执行。这是代码:
def swap(list, num_of_swaps, current_swap, swap_instructions = []):
for l1 in range(0,len(list)):
for l2 in range(l1+1,len(list)):
for e1 in list[l1]:
for e2 in list[l2]:
swap_instructions.append({l1:{'add': e2, 'remove': e1},
l2:{'add': e1, 'remove':e2}})
if current_round < max_repetitions:
swap(list, num_of_swaps, current_round+1, swap_instructions)
success = swap_and_do_checks(list, swap_instructions)
if success:
return swap_instructions
del swap_instructions[-1]
return []
我不知道如何避免重复而不成本太高。
将感谢您的帮助。
谢谢
解决方案
推荐阅读
- python - 基数为 16 的 int() 的文字无效
- google-chrome - ColdFusion cflocation 令牌问题 Chrome
- mysql - 组内两个日期之间的 SQL 不同
- python - 无法使用 Cloud Foundry 推送启动 Django 应用程序
- angular - 原始变量在 Angular 模板中仅更新一次
- powershell - 带有 2 对引号的 Powershell cmd /c 适用于 Win 7,但不适用于 Win 10
- multilingual - Surveymonkey API V3 中受访者的“语言”在哪里
- ansible - 使用 Ansible 更新单个 vhost 文件
- javascript - 如何检查对象是否包含某个键?
- podio - 沙盒中的 Podio 是如何工作的?