首页 > 解决方案 > 使用 itertools 限制排列

问题描述

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

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

perm_pairs = itertools.permutations(my_list, 4)

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

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

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

标签: pythonitertools

解决方案


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

推荐阅读