在票面價值,這個問題似乎問這樣的:
如何過濾這個巨大的字符串列表,而不必首先構建整個列表的痛苦?
答案是:你已經在做它! itertools
中的東西產生迭代構建的延遲生成的序列。所以你現有的代碼是而不是產生了數十億字符串的巨大列表。
但是,還有你可能會想要問一個可能更有趣的問題:
如果我通過生成的所有字符串,並與三胞胎過濾掉那些無三重串,我的代碼是有做額外的工作,因爲大部分生成的字符串都會有三元組。假設字符串按字典順序生成;那麼他們的第一個4 ** 17就會開始AAA,我們真的應該可以跳過所有這些。我們怎樣才能做得更好?
不幸的是,如果你想要做這那麼你將不得不編寫自己的代碼來做到這一點; itertools
不提供這種「模式篩選產品」功能。
它可能是這個樣子:
# generate all n-tuples with the property that their k-th element
# is one of the things returned by successors(initial (k-1)-tuple).
# So e.g. the first element is one of the things returned by
# successors(()).
def restricted_tuples(successors, n):
assert(n>=0)
if n==0:
for t in successors(()): yield (t,)
else:
for start in restricted_tuples(successors, n-1):
for t in successors(start): yield start+(t,)
def successors_no_triples(start, alphabet):
if len(start)<2 or start[-1] != start[-2]:
for t in alphabet: yield t
else:
banned = start[-1]
for t in alphabet:
if t != banned: yield t
print([''.join(x) for x in restricted_tuples(lambda start: successors_no_triples(start,'ABC'), 5)])
的print
末僅僅是說明性的。如果您想從原始提問者的案例中打印出所有數十億字符串,則最好循環遍歷restricted_tuples
生成的序列,並分別對每一個字符串進行串化和打印。
順便提一下,4個帶有這個屬性的字母的長度爲20的序列數量結果是415,289,569,968。如果您嘗試全部生成它們,您將會等待一段時間,尤其是如果您真的想要做到任何事情。
'permutations'沒有'repeat'關鍵字參數。你確定這是你的代碼嗎?你是什麼意思*避免連續超過3個相同的字符*? – styvane
我很確定它的目標是成爲'產品',它'*'採用'repeat'參數,而不像'permutations'那樣* jonc *希望它做。 –
您是否試過numpy選擇採取您的列表的隨機樣本: http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.choice.html#numpy.random.choice This你可以指定你想要的數量。 – SSchneid