Python 3.x 如何使列表在一行中不重复同一字符三次
我有这个密码Python 3.x 如何使列表在一行中不重复同一字符三次,python-3.x,list,Python 3.x,List,我有这个密码 for letters in itertools.product(charset, repeat=47): string = "".join(letters) print(string) 从那以后就是 aaaaaaaaaaaa aaaaaaaaaaab aaaaaaaaaaac 但我想知道我如何才能使它不产生相同的三个字符的行,以便输出 dddcccbbbaaa dddcccbbbaab dddcccbbbaac 等等,而不使用这样的东西 for letter
for letters in itertools.product(charset, repeat=47):
string = "".join(letters)
print(string)
从那以后就是
aaaaaaaaaaaa
aaaaaaaaaaab
aaaaaaaaaaac
但我想知道我如何才能使它不产生相同的三个字符的行,以便输出
dddcccbbbaaa
dddcccbbbaab
dddcccbbbaac
等等,而不使用这样的东西
for letters in itertools.product(charset, repeat=47):
string = "".join(letters)
for i in range(1,len(string)-1):
if string[i] is not string[i+1] is not string[i-1]:
print(string)
else:
pass
下面是您的代码稍微修改过的版本:
import itertools
def version1(charset, N):
result = []
for letters in itertools.product(charset, repeat=N):
string = "".join(letters)
for i in range(0, N-2):
if string[i] == string[i+1] == string[i+2]:
break
else: # did not find any ZZZ sequence
result.append(string)
return result
>>> charset = "abc"
>>> N = 5
>>> version1(charset, N)
['aabaa', 'aabab', 'aabac', 'aabba', 'aabbc', 'aabca', 'aabcb', 'aabcc', 'aacaa', 'aacab', 'aacac', 'aacba', 'aacbb', 'aacbc', 'aacca', 'aaccb', 'abaab', 'abaac', 'ababa', 'ababb', 'ababc', 'abaca', 'abacb', 'abacc', 'abbaa', 'abbab', 'abbac', 'abbca', 'abbcb', 'abbcc', 'abcaa', 'abcab', 'abcac', 'abcba', 'abcbb', 'abcbc', 'abcca', 'abccb', 'acaab', 'acaac', 'acaba', 'acabb', 'acabc', 'acaca', 'acacb', 'acacc', 'acbaa', 'acbab', 'acbac', 'acbba', 'acbbc', 'acbca', 'acbcb', 'acbcc', 'accaa', 'accab', 'accac', 'accba', 'accbb', 'accbc', 'baaba', 'baabb', 'baabc', 'baaca', 'baacb', 'baacc', 'babaa', 'babab', 'babac', 'babba', 'babbc', 'babca', 'babcb', 'babcc', 'bacaa', 'bacab', 'bacac', 'bacba', 'bacbb', 'bacbc', 'bacca', 'baccb', 'bbaab', 'bbaac', 'bbaba', 'bbabb', 'bbabc', 'bbaca', 'bbacb', 'bbacc', 'bbcaa', 'bbcab', 'bbcac', 'bbcba', 'bbcbb', 'bbcbc', 'bbcca', 'bbccb', 'bcaab', 'bcaac', 'bcaba', 'bcabb', 'bcabc', 'bcaca', 'bcacb', 'bcacc', 'bcbaa', 'bcbab', 'bcbac', 'bcbba', 'bcbbc', 'bcbca', 'bcbcb', 'bcbcc', 'bccaa', 'bccab', 'bccac', 'bccba', 'bccbb', 'bccbc', 'caaba', 'caabb', 'caabc', 'caaca', 'caacb', 'caacc', 'cabaa', 'cabab', 'cabac', 'cabba', 'cabbc', 'cabca', 'cabcb', 'cabcc', 'cacaa', 'cacab', 'cacac', 'cacba', 'cacbb', 'cacbc', 'cacca', 'caccb', 'cbaab', 'cbaac', 'cbaba', 'cbabb', 'cbabc', 'cbaca', 'cbacb', 'cbacc', 'cbbaa', 'cbbab', 'cbbac', 'cbbca', 'cbbcb', 'cbbcc', 'cbcaa', 'cbcab', 'cbcac', 'cbcba', 'cbcbb', 'cbcbc', 'cbcca', 'cbccb', 'ccaab', 'ccaac', 'ccaba', 'ccabb', 'ccabc', 'ccaca', 'ccacb', 'ccacc', 'ccbaa', 'ccbab', 'ccbac', 'ccbba', 'ccbbc', 'ccbca', 'ccbcb', 'ccbcc']
你的算法不是最优的。请看第一个字符串:
aaaaa
您知道您需要len(charset)-1
iterations(aaaab,aaaac
)才能到达:
aaaba
aaaca
然后再次len(charset)-1
迭代以达到:
aaaba
aaaca
但是您可以跳过所有这些迭代,因为aaa
开始。
实际上,当您找到sequenceaaa
时,您可以跳过len(charset)^K-1
,其中
K
是剩余字符数。这不会改变大O的复杂性,
但这将减少长序列的计算时间,具体取决于
字符集的大小和字符串的字符数
直观地说,如果字符集只有很少的字符,您将节省大量的计算
首先,您需要找到ZZZ序列后的第一个字母:
def first_after_ZZZ(string):
for i in range(0, len(string)-2):
if string[i] == string[i+1] == string[i+2]:
return i+3
return -1
>>> first_after_ZZZ("ababa")
-1
>>> first_after_ZZZ("aaaba")
3
>>> first_after_ZZZ("aaabaaabb")
3
我们在前面的代码(中间步骤)中使用此函数:
现在,我们可以跳过一些元素:
def version3(charset, N):
result = []
it = itertools.product(charset, repeat=N)
for letters in it:
string = "".join(letters)
f = first_after_ZZZ(string)
if f == -1:
result.append(string)
elif f < N:
K = N - f # K > 1
to_skip = len(charset)**K-1
next(itertools.islice(it, to_skip, to_skip), None) # this will skip to_skip tuples
return result
>>> version3(charset, N) == version1(charset, N)
True
这是令人印象深刻的,因为字符集很小,但对于整个字母表来说可能微不足道
当然,如果您编写自己的产品
实现,您可以跳过
元组而不生成它们,这可能会更快。我不明白:“如何使它不在一行中重复同一个字符三次”,然后期望的结果是
dddcccbbbaaa
其中每个字符在一行中重复三次!?这几乎快了2倍,但当涉及到大字符集时,由于sys.maxsize,它不起作用