Как применить логический оператор ко всем элементам в списке Python

TortoiseSVN может показать изменения изображения бок о бок, который действительно полезен. Я использовал его с различными командами с большим уровнем успеха. Художники любили иметь способность откатывать вещи (после того, как они привыкли к понятиям). Действительно занимает много места, все же.

71
задан Robert Christie 24 November 2009 в 14:44
поделиться

5 ответов

Логические и во всех элементах в a_list :

all(a_list)

Логический или для всех элементов в a_list :

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

, и мы могли бы продолжать весь день, но да, питонический способ - использовать все и любой : -)

Кстати, в Python нет исключения хвостовой рекурсии, поэтому не пытайтесь напрямую транслировать код LISP; -)

146
ответ дан 24 November 2019 в 12:51
поделиться

Reduce может сделать это:

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

Как уже упоминалось, all - самый лаконичный способ сделать это. Но сокращение отвечает на более общий вопрос: «Как применить логический оператор ко всем элементам в списке Python?»

14
ответ дан 24 November 2019 в 12:51
поделиться

The idiom for such operations is to use the reduce function (global in Python 2.X, in module functools in Python 3.X) with an appropriate binary operator either taken from the operator module or coded explicitly. In your case, it's operator.and_

reduce(operator.and_, [True, True, False])
8
ответ дан 24 November 2019 в 12:51
поделиться

Как показывают другие ответы, существует несколько способов выполнить эту задачу. Вот еще одно решение, использующее функции из стандартной библиотеки:

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)
0
ответ дан 24 November 2019 в 12:51
поделиться

Операция И и ИЛИ проста:

>>> 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]

Конечно, то, как вы будете использовать эти результаты, может потребовать некоторых интересных приложений теоремы ДеМоргана.

31
ответ дан 24 November 2019 в 12:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: