【问题标题】:How can I return False if a character in a string appears three times in a row如果字符串中的字符连续出现 3 次,如何返回 False
【发布时间】:2022-01-01 14:26:49
【问题描述】:

我之前问过这个问题,虽然 StackOverflow 好心用户的回答是对的,但它有点无法回答我的问题,或者对于像我这样的初学者来说有点复杂,所以我会再问一次:)。

所以这是一个检查字符串是否符合特定条件的代码......

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 password(password: str):
    if passwordlength(password):
        if not (6 < len(password) < 12):
            return False
    else:     
        return True

所以这部分工作正常。我的初始代码没有问题。但是,我正在尝试编辑我的代码,以便如果 一个数字、字符或字母连续出现 3 次......例如,AAA 或 ccc 或 111 或 ###,则输出将为 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 password(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

我应该对我的代码进行哪些更改以确保它有效??

请尽可能使用最简单的编码形式,因为我是初学者,我想在编程的同时学习 :)。另外请不要使用importcollections.iter,因为我还没有学过……我正在网上学习python,我还没有学那么远……谢谢:)

【问题讨论】:

  • 我爱re我自己。在处理字符串时,我总是使用re
  • 我可能在这里遗漏了什么吗?我在任何地方都没有看到问题中提到的re

标签: python list dictionary tuples


【解决方案1】:

你可以检查一下:

any(char * 3 in password
    for char in password)

或者你的风格:

        for char in password:
            if char * 3 in password:
                return False

【讨论】:

  • 也可以使用for char in set(password),这样您就可以避免多次检查重复字符。
  • @Reti43 是的,但我想说密码很短,而且这种密码有效性检查很少见,所以它不需要很快。所以我更喜欢简单。
  • 有时甚至最好选择故意慢速算法来检查/验证密码。
【解决方案2】:

一个简单的实现是:

def check_repeating_chars(password):
    for i in range(2, len(password)):
        if password[i] == password[i-1] == password[i-2]:
            return False
    return True

【讨论】:

    【解决方案3】:

    这是一个将字符串作为输入的函数,如果任何字符连续出现 3 次,则返回 true,否则返回 false

    def does_char_appear_three_times_in_a_row(input_string):
        last_char = ''
        count = 0
        for c in input_string:
            if c == last_char:
                count += 1
            else:
                count = 1
            if count == 3:
                return True
            last_char = c
        return False
    

    【讨论】:

    • 最好使用简单有意义的方法/函数名而不是句子
    • @AvishkaDambawinna 说谁?从自我记录和教育的角度来看,函数名称在这里非常有意义。
    • 同意 Selcuk,简单并不总是更好。例如,名为L 的列表说明了什么?我其实很喜欢这个函数名,因为如果不简洁就很清楚,但如果归根结底,我更喜欢简洁而不是简洁。
    • 这其实是The Zen of Python中的格言之一:“显式胜于隐式。”
    • @AvishkaDambawinna 够公平的。 “多么明确”总是基于意见。话虽如此,笼统的“不要使用句子”声明并不总是正确的。
    【解决方案4】:

    我想出了以下想法:

    qtt = 0
    last_char = None
    for char in password:
      if char == last_char:
        qtt += 1
      else:
        qtt = 0
    
      if qtt == 2:
        return False
      last_char = char
    

    遍历字符串中的每个字符,然后将其与最后一个字符进行比较,如果它们相同,则计数,否则,您必须重新开始计数,因此将 0 传递给qtt。如果qtt 等于 2,则您发现 2 个 last_chars 等于 chars,它会为您提供 3 个相同字符的序列。最后,您将 last_char 更改为实际的 char,因此下一次它将是 last_char 并且 for 会给您一个新的。我希望 a 足够具有指导意义。

    【讨论】:

    • 这不是和@ErikMcKelvey的回答基本一样吗?
    • 是的,但是当我回答时他还没有回答。可能我们几乎同时回答了
    【解决方案5】:

    您的代码无法按您希望的方式运行,因为password.count(char)char所有 次出现计数。一种可能的方式来做你想做的事情是这样的:

    def check_char(password):
       for n in range(0, (len(password)-2)):
          if (password[n] == password[n+1]) and (password[n] == password[n+2]):
             return False
       return True
    

    但我会推荐使用正则表达式。

    【讨论】:

    • 注意,在Python中你可以写if password[n] == password[n+1] == password[n+2]:
    • 我相信这样的答案已经存在:stackoverflow.com/a/70075101/2055998
    • 对!我刚刚在这里看到了另一个答案。谢谢指出!
    • 这是一个简单并不更好的例子。在这种情况下,函数名称非常模糊。
    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2021-01-27
    相关资源
    最近更新 更多