【问题标题】:Limiting permutations using itertools使用 itertools 限制排列
【发布时间】:2021-02-10 19:47:07
【问题描述】:

我正在编写一个工具,它希望从 13 个字符长的列表中生成所有可能的对。每对必须交换其第二个元素。即从列表ABCDEFGHIJKLM 我想生成诸如AB CDAB CECD GK 之类的对。

我正在使用 itertools.permutations 来执行此操作,并且它有效:

perm_pairs = itertools.permutations(my_list, 4)

我计划迭代 perm_pairs 并在单独的程序中使用这些对。但是,由于顺序并不重要,并且后续过程具有很高的时间复杂度,我想通过防止对倒置来提高效率。即如果我已经拥有AB CD,我不想生成CD AB

itertools.combinations() 不会生成所有必需的对,但 itertools.permeations() 生成的对是迭代所需的 4 倍。

是否有一种“中间方式”可以避免产生反转?

【问题讨论】:

标签: python itertools


【解决方案1】:

您可以为每对字母使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多