4 回答

TA貢獻1744條經(jīng)驗 獲得超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 個字母來說根本不需要時間,但對于更多字母來說很快就會花費更長的時間。也就是說,如果“不重復”是指任何字母都不應出現(xiàn)超過一次。相反,如果您只是希望不重復連續(xù)的字母(這已經(jīng)通過交替輔音和元音來保證),或者不重復名稱(通過不隨機地構(gòu)造它們來保證),您可以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在后面列出列表,或者如果您只想要幾個這樣的名稱,您可以在結(jié)果列表上使用random.sample或。random.choice

TA貢獻1799條經(jīng)驗 獲得超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條經(jīng)驗 獲得超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條經(jīng)驗 獲得超3個贊
我想確?;卮鹉愕膯栴}
我只是想了解我必須運行生成周期多少次
因為我認為對問題有更好的直覺很重要。
您有 20 個輔音和 6 個元音,總共產(chǎn)生 20x6x20x6x20 = 288000 種不同的單詞組合。由于它是連續(xù)的,因此您可以將其拆分以使其更易于理解。您可以將 20 個不同的輔音作為第一個字母,然后為每一個添加 6 個元音 = 20x6 = 120。然后您可以繼續(xù)說,對于這 120 個組合,您可以為每個組合添加 20 個輔音 = 120x20 = 2400 。 .. 等等。
添加回答
舉報