Лучший способ проверить, все ли элементы в любом списке списков находятся в строке - PullRequest
0 голосов
/ 20 января 2020

У меня есть список списков типа mylist = [["1", "2"], ["abc", "def"]] и строка типа mystr = "1 2".

Я хочу проверить, есть ли в любом из списков в mylist все строки в строке.

Я добился этого, выполнив следующее.

if True in [all(keyword in mystr for keyword in keywords) for keywords in mylist]:
    print("yes")

Есть ли более быстрый способ?

Ответы [ 2 ]

0 голосов
/ 20 января 2020
matcher = mystr.__contains__
any(all(map(matcher, keywords)) for keywords in mylist)

Тесты:

>>> min(repeat(lambda: any(all(map(matcher, keywords)) for keywords in mylist), repeat=20))
1.1285329000002093
>>> min(repeat(lambda: any(all(map(mystr.__contains__, keywords)) for keywords in mylist), repeat=20))
1.2246240000004036
>>> min(repeat(lambda: any(all(keyword in mystr for keyword in keywords) for keywords in mylist), repeat=20))
1.3369910999999775
>>> min(repeat(lambda: True in [all(keyword in mystr for keyword in keywords) for keywords in mylist], repeat=20))
1.726889200000187
0 голосов
/ 20 января 2020

Да, используя any.

if any(all(keyword in mystr for keyword in keywords) for keywords in mylist):
    print("yes")

Это быстрее, потому что останавливает итерации (короткие замыкания), как только видит истинное значение. У него также есть побочное преимущество: его легче читать.

Спасибо jonrsharpe за упоминание этого в комментариях

...