当前位置: 首页 > 知识库问答 >
问题:

如果字符串中的一个字符在一行中出现三次,如何使输出返回False?

齐承泽
2023-03-14

所以我创建了这段代码,它接收一个列表并根据它们是否满足这些标准返回True或False。这是我的密码

def passwordlength(password: str):
    upper = digit = special = False
    for char in password:
        if char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" :
            upper = True
        elif char in "1234567890":
            digit = True
        elif char in "$#@%!":
            special = True
    return upper and digit and special

def passwordOK(password: str):
    if passwordlength(password):
        if not (6 < len(password) < 12):
            return False
        else:
            return True
    return False

现在我想添加一个新的转折点,即如果列表中的任何字母、数字、字符在一行中出现3次,结果将返回False。。这是我的尝试。。。

    def passwordlength(password: str):
    upper = digit = special = False
    for char in password:
        if char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" :
            upper = True
        elif char in "1234567890":
            digit = True
        elif char in "$#@%!":
            special = True
    return upper and digit and special

def passwordOK(password: str):
    if passwordlength(password):
        if not (6 < len(password) < 12):
            return False
        for char in password:
            if password.count(char) > 3:
                return False
        return True
    return False

然而,这显然根本不起作用...我在这里做错了什么??我的代码应该是为了我的输出是正确的??

共有3个答案

邓德本
2023-03-14

有许多不同的方法来实现这一点。

就我个人而言,我可能会做这样的事情:

def has_repeated_chars(password: str, n_repetitions: int=3) -> bool:
    ngrams = zip(*(password[i] for i in range(n_repetitions)))
    return min(len(set(trigram)) for trigram in ngrams) == 1

一般来说,逻辑是创建一个长度为3的ngram的iterable,为每个ngram创建一个集合,如果集合的长度为1,那么我们知道相同的字符已经重复了3次。

纪勇军
2023-03-14

当字符串中出现3次字符、数字时,如果希望返回false,则显然应更改If条件,如下所示:

[...]
for char in password:
    if password.count(char) == 3:
        return False
[...]

如果你的意思是至少3次出现:

[...]
for char in password:
    if password.count(char) >= 3:
        return False
[...]

但是password.count(char)将循环遍历每个char的整个密码,所以我们为什么不循环一次,并获得结果:

[...]
from collections import defaultdict
defdict = defaultdict(lambda: 0)
for char in password:
    defdict[char] += 1
    if defdict[char] >= 3:
        return false
[...]

我的意思是像连续3次,顺便说一句,如果它的AAA,BBB,CCC,那么它应该返回假。。如果是阿巴纳。。那就没关系了

定义这样一个函数:

def has_3consecutive_char(password: str) -> bool:
    from collections import defaultdict
    defdict = defaultdict(lambda: 0)
    prev_char = ""
    for char in password:
        if prev_char == char:
            defdict[char] += 1
            if defdict[char] >= 2:
                return True
        else:
            defdict[char] = 0
        prev_char = char
    return False

然后在passwordOK函数中使用它:

def passwordOK(password: str):
    if passwordlength(password):
        if not (6 < len(password) < 12):
            return False
        if has_3consecutive_char(password):
                return False
        return True
    return False
艾国安
2023-03-14

使用itertools中的groupby。使用此版本,可以设置行中的字符数。

from itertools import groupby

def passwordinarow(password: str, n: int=3):
    """Return True if password contains 'n' characters in a row else False."""
    return any([len(list(g)) >= n for c, g in groupby(password)])

测试

>>> passwordinarow('AAABC123$')
True

>>> passwordinarow('ABC123$')
False
 类似资料:
  • 我有一个字符串“aabccdeef” 现在我只想大写每个字符的第一次出现,以便在Java中o/p是AaBCcDEeF

  • 本文向大家介绍统计某一字符或字符串在另一个字符串中出现的次数相关面试题,主要包含被问及统计某一字符或字符串在另一个字符串中出现的次数时的应答技巧和注意事项,需要的朋友参考一下

  • 问题内容: 在PHP中,最简单的方法是在首次出现特定字符之前返回字符串的一部分? 例如,如果我有一个字符串… “快速的棕色狐狸跳过了等等,等等。” …并且我正在过滤空格字符(“”),该函数将返回“ The” 谢谢! 问题答案: 您 可以 这样做: 但我喜欢这样 更好 :

  • 问题内容: 好的,这就是我的for子手游戏代码,我唯一要做的就是让我的程序将其中一个单词随机化,这应该在方法中成功完成。但是我唯一的问题是让String变量 “ word” 返回到主类(在主类中的所有 “ word” 变量下面都有错误)。 如果我可以通过这种方法获得另一种帮助,或者从列表中产生随机单词的另一种方法,那将是惊人的。 问题答案: 在Java中,参数是通过值而不是引用传递的。因此,您不能

  • 问题内容: 在Objective-C中,我使用了: 但是现在NSBackWardsSearch似乎不存在。谁能为Swift提供等效的代码? 我希望能够在整个字符串中找到字符数。因此,在上面的示例中,它将返回3。 问题答案: 可可框架应该可以在Swift中访问,但是您需要导入它们。尝试导入以访问NSString API。从“将Swift与Cocoa和Objective-C结合使用”指南的“使用Coc

  • 问题内容: 我想在下面替换String的第一次出现。 **如果测试包含以下输入,则不应替换 请参阅评论,(末尾加空格) 看评论, 看评论** 我想获得如下输出, 提前致谢, 问题答案: 您可以使用String方法。