4 回答
TA贡献1744条经验 获得超4个赞
您可以使用itertools.combinations来获取 3 个不同的辅音和 2 个不同的元音,并获取permutations它们来生成所有可能的“名称”。
from itertools import combinations, permutations
names = [a+b+c+d+e for cons in combinations(consonants, 3)
for a, c, e in permutations(cons)
for vow in combinations(vowels, 2)
for b, d in permutations(vow)]
总共只有 205,200 = 20x19x18x6x5,因此对于 5 个字母来说根本不需要时间,但对于更多字母来说很快就会花费更长的时间。也就是说,如果“不重复”是指任何字母都不应出现超过一次。相反,如果您只是希望不重复连续的字母(这已经通过交替辅音和元音来保证),或者不重复名称(通过不随机地构造它们来保证),您可以itertools.product使用总共 288,000 个 = 20x20x20x6x6 名称:
names = [a+b+c+d+e for a, c, e in product(consonants, repeat=3)
for b, d in product(vowels, repeat=2)]
如果您想以随机顺序生成它们,您可以只random.shuffle在后面列出列表,或者如果您只想要几个这样的名称,您可以在结果列表上使用random.sample或。random.choice
TA贡献1799条经验 获得超9个赞
如果你想避免重复,你不应该使用随机性,而只是生成所有这样的 ID:
from itertools import product
C = consonants
V = vowels
for id_ in map(''.join, product(C, V, C, V, C)):
print(id_)
或者
from itertools import cycle, islice, product
for id_ in map(''.join, product(*islice(cycle((consonants, vowels)), 5))):
print(id_)
TA贡献1752条经验 获得超4个赞
itertools 允许非重复排列
import itertools, re
names = list(itertools.product(consonants + vowels, repeat=5))
consonants_regex = "(" + "|".join(consonants) + ")"
vowels_regex = "(" + "|".join(vowels) + ")"
search_string = consonants_regex + vowels_regex + consonants_regex + vowels_regex + consonants_regex
names_format = ["".join(name) for name in names if re.match(search_string, "".join(name))]
输出:
>>> len(names)
11881376
>>> len(names_format)
288000
TA贡献1777条经验 获得超3个赞
我想确保回答你的问题
我只是想了解我必须运行生成周期多少次
因为我认为对问题有更好的直觉很重要。
您有 20 个辅音和 6 个元音,总共产生 20x6x20x6x20 = 288000 种不同的单词组合。由于它是连续的,因此您可以将其拆分以使其更易于理解。您可以将 20 个不同的辅音作为第一个字母,然后为每一个添加 6 个元音 = 20x6 = 120。然后您可以继续说,对于这 120 个组合,您可以为每个组合添加 20 个辅音 = 120x20 = 2400 。 .. 等等。
添加回答
举报