Проверьте, если нет в списке - больше условий в Python - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть два списка с не фиксированным количеством элементов, например:

data=['sun','stars','moon','supermoon','planet','comet','galaxy']

forbidden=['mo','st','lax']

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

sun
planet
comet

. То, что я пробовал, это

print [x for x in data if forbidden not in x ]

, которое работает только для одного условия (один элемент в списке forbidden)

Есть ли способ проверить все условия сразу?

Если бы я знал количество элементов в forbidden, я мог бы использовать

print [x for x in data if forbidden[0] not in x and forbidden[1] not in x]

, но он не работает с неизвестнымиколичество предметов.

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вот более функциональный подход:

from itertools import product
from operator import contains, itemgetter

first = itemgetter(0)

p = product(data, forbidden)
f = filter(lambda tup: contains(*tup), p)
set(data).difference(set(map(first, f)))

{'comet', 'planet', 'sun'}  # order is not preserved here if that matters

Редактировать: если данные большие, они будут обрабатываться более изящно и быстрее возвращать результаты

0 голосов
/ 05 февраля 2019

Вы можете использовать all:

data=['sun','stars','moon','supermoon','planet','comet','galaxy']
forbidden=['mo','st','lax']
print([i for i in data if all(c not in i for c in forbidden)])

Выход:

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