【问题标题】:Checking elements in the list检查列表中的元素
【发布时间】:2014-11-10 22:55:10
【问题描述】:

我花了几个小时解决了这个问题,但程序不起作用(语法错误)。 检查类似问题的答案没有帮助。下面的代码有什么问题? 我想检查列表(密码)是否包含至少一个数字,以及其中包含一个大写字母和一个小写字母。 请给我最简单的方法,我是初学者...

def checkio(password):    
    array = list(password)
    #for letter in array:
    if len(array) < 10 or len(array) > 64:
        return False
    if (any(l.isdigit() for l in array) and (any(l.isupper( for l in array) and (any(l.islower for l in array):
        return True
    else:
        return False

【问题讨论】:

  • 你想要 if: else if: else ?试试看。

标签: python list element contain


【解决方案1】:

你的括号是非常错误的。 试试这个。

def checkio(password):    
  array = list(password)
  #for letter in array:
  if len(array) < 10 or len(array) > 64:
      return False
  if ((any(l.isdigit() for l in array)) and (any(l.isupper() for l in array)) and ((any(l.islower() for l in array)))):
      return True
  else:
      return False

【讨论】:

  • @Taha 我没有足够的声望(
【解决方案2】:

有时,如果您很好地格式化代码,这些东西最容易看到。您缺少一些括号:

def checkio(password):
    if 10 < len(password) or len(password) > 64:
        return False

    return (any(l.isdigit() for l in password) and
            any(l.isupper() for l in password) and
            any(l.islower() for l in password)):

注意,您不必从密码中构造一个列表——python 字符串是可迭代的并且具有明确定义的长度。

【讨论】:

  • @mgilson 我认为他正处于学习阶段,打字速记不是他的主要关注点。
  • 你也可以这样做 :: return (len(array)>1) and (len(array)
  • @AaronHall -- 我认为这没有帮助。 'aaa'.isalnum()True,但 OP 希望返回 False,除非存在的每个字符类别中至少有 1 个。
  • @mgilson 你说得对,我正处于学习阶段。为什么你不使用 if 语句和 ise 返回?它是如何工作的?
  • def checkio(data): try: data[9] except IndexError: return False return not (data.isdigit() or data.isalpha() or data.islower() or data.isupper( ))
【解决方案3】:

你可以这样,你少了一些括号,另外,你说at least一个数字,长度应该是&lt;1。也不需要转换成列表,可以迭代strings

def checkio(password):    
    if len(password) < 1 or len(password) > 64:
        return False
    if (any(x.isdigit() for x in password)) and (any(l.isupper for l in password)) and (any(l.islower for l in password)):
        return True
    else:
        return False

print checkio("StackO3f") #True

print checkio("S") #False

print checkio("sssss") #False

【讨论】:

    【解决方案4】:

    当您执行any(l.isdigit() for l in array) 时,您正在创建一个generator。生成器必须“消耗”才能使值正确。

    在这种情况下,您最好使用列表来代替。也不需要调用array = list(password),因为字符串在python中是可迭代的。以下是代码的外观:

    def checkio(password):    
        if len(password) < 10 or len(password) > 64:
            return False
        if any([c.isdigit() for c in password]) and any([c.islower() for c in password]) and any([c.isupper() for c in password]):
            return True
        else:
            return False
    

    在此版本中,any() 函数在使用 [c.func() for c in password] 创建的临时列表上调用。

    【讨论】:

    • 嗯?不...any 将尽可能多地消耗生成器,并在找到真实值后立即停止。使用列表可以消除短路行为,因此不太受欢迎。
    • @mgilson,在 ipython 上对我不起作用 - 但在 python27 控制台上工作,因此我不建议保留生成器。
    • 很好的解释。多亏了你,我对生成器更加熟悉了)
    猜你喜欢
    • 1970-01-01
    • 2013-12-18
    • 2021-09-25
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2016-09-16
    相关资源
    最近更新 更多