python - 使用 itertools 限制排列
问题描述
我正在编写一个工具,它希望从 13 个字符长的列表中生成所有可能的对。每对必须交换其第二个元素。即从ABCDEFGHIJKLM
我想要生成对的列表中,例如AB CD
,AB CE
或CD GK
.
我正在使用 itertools.permutations 来执行此操作,并且它有效:
perm_pairs = itertools.permutations(my_list, 4)
我计划迭代perm_pairs
并在单独的程序中使用这些对。但是,由于顺序并不重要,并且后续过程具有很高的时间复杂度,我想通过防止对倒置来提高效率。即,如果我已经拥有AB CD
我不想生成CD AB
.
itertools.combinations()
不会生成所有必需的对,但itertools.permeations()
生成的对是迭代所需的 4 倍。
有没有一种“中间方式”可以避免产生反转?
解决方案
您可以对每对字母使用 a ,然后检查在某些集合 ( )itertools.permutations
中是否不存在一对对的倒数:perm_pairs
from itertools import permutations
my_list = "ABCDEFGHIJKLM"
perm_pairs = set()
for pair_1 in permutations(my_list, 2):
for pair_2 in permutations((c for c in my_list if c not in pair_1), 2):
if pair_2 + pair_1 not in perm_pairs:
perm_pairs.add(pair_1 + pair_2)
推荐阅读
- python - Elastic Beanstalk - ImportError:无法导入名称“Celery”
- python-3.x - 在 python 中使用我的 gmail 帐户发送电子邮件?
- flutter - Dart 包 - 如何隐藏内部方法和类?
- haskell - 展开存在量化的 GADT
- r - 在R中按组创建基于稀疏变量的日期范围
- python - 在 pandas 列中查找最接近的值
- python - Pandas - 如果不存在分隔符,则使用默认值拆分列
- cadence-workflow - 如何取消从工作流异步调用的活动?
- javascript - 在javascript中合并两个数组和单独的数组
- node.js - async await 没有在 express nodejs 中按顺序执行函数