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
开始。 实际上,当您找到sequence
aaa
时,您可以跳过
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,它不起作用