【问题标题】:List with multiple conditions具有多个条件的列表
【发布时间】:2016-01-18 06:11:05
【问题描述】:

我正在创建一个布尔函数,用于检查列表中的每个元素是否大于 1 且小于 6。此外,列表是正整数,而不是负数、0、字符串或其他任何内容。

我觉得我几乎尝试了所有方法,但找不到我的解决方案。这是我目前暂时拥有的。

def checkList(aList):

    for i in aList:
        if i < 1:
            return False
        elif i > 6:
            return False
        else:
            return True

【问题讨论】:

  • 不太清楚您要做什么。您是要检查一个值是否在 1 和 6 之间,还是所有值都必须在 1 和 6 之间?
  • 对不起,列表中的所有值。
  • @CaseyJones 请编辑您的问题以澄清这一点。您拥有的代码将只处理列表中的第一个元素,因为您使用了 return 语句。

标签: python list for-loop integer conditional


【解决方案1】:

这对你有用

def check_sequence(sequence, low, high):
    if all(isinstance(i, int) for i in sequence):
        return all(low < i < high for i in sequence)
    else:
        return False
print(check_sequence([2, 5, 4, 3, 3], 1, 6))
>> True

这里的重要概念是low &lt; i &lt; high。在 Python 中,您可以指定变量应介于的值范围。

【讨论】:

    【解决方案2】:

    带有all 的单个生成器表达式使用isinstance(i, int) 来检查每个元素是否是一个int,1 &lt;= i &lt;= 6 以确保每个int 在1-6 的范围内:

    def checkList(aList):
       return all(isinstance(i, int)  and 1 < i < 6 for i in aList)
    

    all 将短路并为任何非整数或小于 1 或大于 5 的任何值返回 False,如果所有元素都是整数且在 1-6 范围内,则返回 True。

    在您自己的代码中,当您说要检查 我的列表中的每个元素是否大于 1 且小于 6 时,您正在检查 if i &lt; 1elif i &gt; 6,所以它会是if i &lt; 2elif i &gt; 5 返回 False,1 不小于 1,6 大于 5,所以要更正自己的逻辑并检查整数。

    def checkList(aList):
        for i in aList:
            if not isinstance(i, int):
                 return False
            if i < 2:
                return False
            if i > 5:
                return False
        return True # outside loop
    

    你需要把 return True 移到循环外,因为 one 是一个 int 1 - 6 之间并不意味着它们都是。

    可以改写为:

    def checkList(aList):
        for i in aList:
            if not isinstance(i, int):
                 return False
            if 2 > i > 5:
                return False              
        return True
    

    【讨论】:

      【解决方案3】:

      使用生成器表达式构建元素的中间列表,然后对照all 检查它们是否符合您的约束条件。

      def check_list(li):
          return all((type(i) == int and 1 < i < 6 for i in li))
      

      【讨论】:

      • 如果你愿意,你也可以去掉内括号;)
      【解决方案4】:

      你可以使用filter 它会变成这样

      filtered = filter(seq, lambda x: 1 < int(x) < 6)
      

      这将返回一个过滤列表,其中仅包含 1 到 6 之间的项目。然后您可以检查该列表是否具有相同的长度,以查看是否删除了任何内容。

      走这条路,你的函数应该是这样的:

      def checkList(seq):
          filtered = filter(seq, lambda x: 1 < int(x) < 6)
          return len(filteted) == len(seq)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-16
        相关资源
        最近更新 更多