给定一个字母表字符串,return 组三个项目,每个项目都是字母表中两个字符的唯一集合

Given a string of the alphabet, return sets of three items, with each item being a unique set of two characters from the alphabet

我正在使用 Python 3.10。我有一串字母 'A-Z'。我需要的是每组三个,两个字符排列,都是唯一的,所以一个字母不能在列表中出现超过一次。

因此,['ab', 'cd', 'ef']['ac', 'bd', 'gh'] 有效,但 ['ab', 'ba' 'cd'] 无效。

我尝试过:

full_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
out = []
out.append(list(itertools.permutations(full_list, 8)))

至少要得到一个 8 个字符的字符串,然后我可以将其拆分,但结果数字实在是太大了。

我想这样就可以了:

import itertools

full_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for chunk in (
    [sorted(s) for s in sorted({
        frozenset([
            ''.join(sorted(p[i*2:i*2+2])) for i in range(3)
        ]) 
        for p in itertools.permutations(c)
    })]
    for c in itertools.combinations(full_list, 6)
):
    for pairs in chunk:
        print(pairs)

方法是把它分成两部分:

  1. 获取 6 个唯一字母的所有组合(即 itertools.combinations 调用)
  2. 获得所有将这 6 个字母分成 3 个无序对的独特方法。

例如,第一个 chunk 是您可以用字母 ABCDEF:

组成的所有对组
['AB', 'CE', 'DF']
['AB', 'CD', 'EF']
['AE', 'BD', 'CF']
['AF', 'BC', 'DE']
['AF', 'BD', 'CE']
['AF', 'BE', 'CD']
['AB', 'CF', 'DE']
['AC', 'BD', 'EF']
['AE', 'BC', 'DF']
['AC', 'BE', 'DF']
['AD', 'BF', 'CE']
['AC', 'BF', 'DE']
['AD', 'BC', 'EF']
['AD', 'BE', 'CF']
['AE', 'BF', 'CD']

后面是你可以从 ABCDEG 中得到的所有配对:

['AD', 'BE', 'CG']
['AC', 'BG', 'DE']
['AD', 'BG', 'CE']
['AE', 'BG', 'CD']
['AB', 'CE', 'DG']
['AE', 'BD', 'CG']
['AC', 'BE', 'DG']
['AC', 'BD', 'EG']
['AB', 'CG', 'DE']
['AG', 'BC', 'DE']
['AG', 'BE', 'CD']
['AD', 'BC', 'EG']
['AG', 'BD', 'CE']
['AB', 'CD', 'EG']
['AE', 'BC', 'DG']

它从那里继续。你最终会得到大约 350 万对。

您可以将它们全部分配到一个列表中,例如:

out = [
    pairs for chunk in (
        [sorted(s) for s in sorted({
            frozenset([
                ''.join(sorted(p[i*2:i*2+2])) for i in range(3)
            ]) 
            for p in itertools.permutations(c)
        })]
        for c in itertools.combinations(full_list, 6)
    ) for pairs in chunk
]

但请注意,这需要一段时间——我刚刚在我的电脑上计时了 5 分钟多一点。