Проверка, если что-то не в нескольких списках - как сделать это более элегантно - PullRequest
0 голосов
/ 27 июня 2018

Что работает:

a = ["0"]
b = ["1"]
c = ["2"]
d = ["3"]
if (not "0" in a) and (not "0" in b) and (not "0" in c) and (not "0" in 
d):
  print "you don't want this to be printing"

Что я пробовал и не работает:

if not "0" in (a and b and c and d):
  print ""

if not "0" in a, b, c, d:
  print ""

Что я мог бы использовать, чтобы избежать несправедливости моего первого действующего утверждения, учитывая, что списки должны быть отдельными и у меня их много?

Ответы [ 3 ]

0 голосов
/ 27 июня 2018
if not any(map(lambda x: "0" in x, [a, b, c, d])):
    print "you don't want this to be printing"

Это сопоставление списка ваших списков с лямбда-функцией, которую вы повторяли для каждого списка, "0" in x, где x является параметром лямбда или списком.

0 голосов
/ 27 июня 2018

почему бы просто не присоединиться ко всему списку и проверить:

if "0" not in a + b + c + d:
    print("you don't want this to be printing")

и более быстрое решение set для списков среднего размера, вот некоторые тесты на производительность:

In [1]: from random import randint
   ...: a = [str(randint(1, 1000)) for _ in range(500)]
   ...: b = [str(randint(1, 1000)) for _ in range(500)]
   ...: c = [str(randint(1, 1000)) for _ in range(500)]
   ...: d = [str(randint(1, 1000)) for _ in range(500)]
   ...: 

In [2]: %timeit "0" not in a + b + c + d
30.2 µs ± 265 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [3]: %timeit "0" not in set().union(a, b, c, d)
48.5 µs ± 219 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

но решение с использованием set сэкономило память, поскольку a + b + c + d создает новый большой список.

0 голосов
/ 27 июня 2018

Поместите все в список, затем используйте all:

lists = [a, b, c, d]
if all("0" not in x for x in lists):
    print("you don't want this to be printing")

Но, вероятно, быстрее (и понятнее) использовать закон Деморгана и отрицать:

lists = [a, b, c, d]
if not any("0" in x for x in lists):
    print("you don't want this to be printing")

Еще быстрее (и четче):

if "0" not in set().union(a, b, c, d):
    print("you don't want this to be printing")
...