Путаница с Python's all (). Любое решение, которое легче понять? - PullRequest
0 голосов
/ 20 апреля 2020

Я нашел много семантичных c ошибок из-за путаницы подстановки переменных в неправильных местах для python all()

Логическое выражение, которым я поделюсь предназначен для того, чтобы убедиться, что все элементы в X существуют в new_list.

Например, если new_list = 1,2,3 и X = 1..to...9. Выражение, которое я использовал, вернуло TRUE , когда ответ действительно FALSE .

>>> X = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> new_list = [1,2,3]
>>> all(elem in X for elem in new_list)
True
 # Notice that a False positive returned. Not all elements in X exist in new_list

Вопрос

Поскольку в прошлом логическое выражение вызывало ошибки semanti c, существует ли какой-либо способ , более легкий для чтения ? И, возможно, объяснение тому, кто ограничен в кодировании?

Ответы [ 3 ]

3 голосов
/ 20 апреля 2020

Более простым (и более эффективным) способом может быть использование методов set:

>>> set(X).issubset(new_list)
False
2 голосов
/ 20 апреля 2020

Если вы хотите проверить, все ли элементы в X находятся в new_list, вы должны выполнить итерацию для каждого элемента в X, а затем проверить, находится ли каждый из этих элементов в new_list. Вы поступили наоборот:

X = [1, 2, 3, 4, 5, 6, 7, 8, 9]
new_list = [1,2,3]
all((number_in_x in new_list) for number_in_x in X)

Как говорится, использование set s в качестве @wim обеспечивает лучший способ решения вашей проблемы.

2 голосов
/ 20 апреля 2020

Вы неправильно прочитали синтаксис:

X = [1, 2, 3, 4, 5, 6, 7, 8, 9]
new_list = [1,2,3]
all(elem in X for elem in new_list)

Это проверяет, все ли elem в new_list встречаются в X. Вероятно, вы хотели

print( all( elem in new_list     for elem in X) )

            ^^^^^^^^^^^^^^^^     ^^^^^^^^^^^^^   
           condition to check    what to check
           to get a True/False

, что означает: проверить, все ли elem в X происходят в new_list.


Документация all () объясняет это обычным l oop:

all ( iterable )

Возвращает True, если все элементы Итерируемый - это истина (или, если Итерируемый пустой) Эквивалентно:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True
...