代码之家  ›  专栏  ›  技术社区  ›  Robert Christie

如何将逻辑运算符应用于python列表中的所有元素

  •  64
  • Robert Christie  · 技术社区  · 15 年前

    我有一张巨蟒的布尔人列表。我想和(或不想)他们一起得到结果。下面的代码可以工作,但不是很蟒蛇。

    def apply_and(alist):
     if len(alist) > 1:
         return alist[0] and apply_and(alist[1:])
     else:
         return alist[0]
    

    关于如何让它更像蟒蛇的任何建议都值得赞赏。

    6 回复  |  直到 9 年前
        1
  •  134
  •   Stew    9 年前

    逻辑的 and 在所有元素中 a_list :

    all(a_list)
    

    逻辑 or 在所有元素中 A级表 :

    any(a_list)
    

    如果你觉得有创造力,你也可以做:

    import operator
    def my_all(a_list):
      return reduce(operator.and_, a_list, True)
    
    def my_any(a_list):
      return reduce(operator.or_, a_list, False)
    

    请记住,这些不在短路中评估,而内置的是;-)

    另一个有趣的方式:

    def my_all_v2(a_list):
      return len(filter(None,a_list)) == len(a_list)
    
    def my_any_v2(a_list):
      return len(filter(None,a_list)) > 0
    

    还有一个:

    def my_all_v3(a_list):
      for i in a_list:
        if not i:
          return False
      return True
    
    def my_any_v3(a_list):
      for i in a_list:
        if i:
          return True
      return False
    

    我们可以继续一整天,但是,是的,用的是蟒蛇的方式。 all any -)

    顺便说一下,python没有尾部递归消除,所以不要试图直接翻译lisp代码;-)

        2
  •  31
  •   Jason Baker    15 年前

    anding和oring很简单:

    >>> some_list = [True] * 100
    # OR
    >>> any(some_list)
    True
    #AND
    >>> all(some_list)
    True
    >>> some_list[0] = False
    >>> any(some_list)
    True
    >>> all(some_list)
    False
    

    注意也相当容易:

    >>> [not x for x in some_list]
    [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
    

    当然,如何使用这些结果可能需要demorgan定理的一些有趣的应用。

        3
  •  13
  •   Frank Krueger    15 年前

    Reduce 可以做到这一点:

    reduce(lambda a,b: a and b, alist, True)
    

    正如Fortran所提到的,一切都是最简洁的方法。但reduce回答了更一般的问题“如何将逻辑运算符应用于Python列表中的所有元素?”

        4
  •  7
  •   Eli Bendersky    15 年前

    这种操作的习惯用法是 reduce 函数(python 2.x中的全局函数,模块中的全局函数) functools 在python 3.x)中,使用适当的二进制运算符 operator 模块或显式编码。在你的情况下,它是 operator.and_

    reduce(operator.and_, [True, True, False])
    
        5
  •  3
  •   Xarts    14 年前

    另一个解决方案是:

    def my_and(a_list):
        return not (False in a_list)
    
    def my_or(a_list):
        return True in a_list
    

    如果所有元素都为true,那么anding all元素将返回true,因此列表中没有false。 ORing类似,但如果列表中至少存在一个真值,它应该返回真值。

        6
  •  0
  •   mipadi    15 年前

    如其他答案所示,完成这项任务有多种方法。下面是另一个使用标准库中函数的解决方案:

    from functools import partial
    
    apply_and = all
    apply_or = any
    apply_not = partial(map, lambda x: not x)
    
    if __name__ == "__main__":
        ls = [True, True, False, True, False, True]
        print "Original: ", ls
        print "and: ", apply_and(ls)
        print "or: ", apply_or(ls)
        print "not: ", apply_not(ls)