给定一个字母表字符串,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)
方法是把它分成两部分:
- 获取 6 个唯一字母的所有组合(即
itertools.combinations
调用)
- 获得所有将这 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 分钟多一点。
我正在使用 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)
方法是把它分成两部分:
- 获取 6 个唯一字母的所有组合(即
itertools.combinations
调用) - 获得所有将这 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 分钟多一点。