Python списки поиска со списками, все и любые - PullRequest
1 голос
/ 29 мая 2020

У меня по какой-то причине возникли проблемы с определенным оператором if. Допустим, у меня есть три списка:

list1 = [1,2,3,4,5]
list2 = [1,2,4,5]
list3 = [4,5,6,7,8]

Я оцениваю каждый. Я хочу отметить это, если в списке есть 4 И 5, но нет ни 2 ИЛИ 3. Я думал, что это сработает:

if all(q in [4,5] for q in the_list_name) and not any(q in [2,3] for q in the_list_name)

Я ожидал, что это пометит только list3. Однако он возвращает false во всех списках. Интересно, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Если мы посмотрим на all(q in [4,5] for q in the_list_name), то есть только половину этого if, мы увидим, что он возвращает False для всех списков. Этот оператор фактически проверяет, равны ли все элементы в списке 4 или 5. То же самое для другого, он проверяет, все ли элементы равны 3 или 4, поэтому имеет смысл, чтобы все они были False.

Чтобы правильно проверить, содержит ли список 4 и 5, но не содержит 3 ИЛИ 4, вы можете изменить свой код на:

inc = [4, 5]
exc = [2, 3]
testList = lambda l, inc, exc: all(i in l for i in inc) and not any(e in exc for e in l)

, получив результаты:

>>> testList(list1, [4, 5], [2, 3])
False
>>> testList(list2, [4, 5], [2, 3])
False
>>> testList(list3, [4, 5], [2, 3])
True

При внимательном рассмотрении:

  • all(i in l for i in inc): все элементы из c (элементы, которые необходимо включить) являются частью данного списка l
  • not any(e in exc for e in l): для каждого элемента в данном списке l, ни один из них не должен быть в списке ex c (элементы, которые необходимо исключить)

Изменить:

Если вы хотите использовать ответы @ekhumoro из комментариев (что более элегантно), но также имеете параметры для элементов, которые необходимо включить / исключить, вы можете использовать:

testList = lambda l, i, e: {*i}.issubset(l) and not {*e}.intersection(l)
0 голосов
/ 29 мая 2020

Простой подход может быть таким: -

if ( (4 in _list_name and 5 in _list_name )and (2 not in _list_name or 3 not in _list_name))

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