Как использовать циклы в условных выражениях в Python? - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу проверить, содержит ли список только определенный элемент (в моем случае его нет)

Я считаю, что есть питонский способ сделать это, я попытался: if mydict[direction] == None for direction in DIRECTIONS: ...

но это, очевидно, не работает

Другими словами, мне нужен ПИФОНИЧЕСКИЙ способ, который позволил бы мне сократить следующий код:

def ispure(element)
    for direction in DIRECTIONS:
        if mydict[direction] != element
            return False
        else:
            pass
    return True

Надеюсь, я прояснил ситуацию и заранее благодарен.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Есть несколько решений, так что вы можете выбрать свой яд.Предполагая, что a - это список из 100 None с, вот некоторые из них, которые я могу придумать (отсортированные по производительности на моей машине):


Использование set:

def only_element(element, ls):
    return set(ls) == set([element])

Время:

$ python -m timeit 'set(a) == set([None])'
100000 loops, best of 5: 3.06 µs per loop

Использование all:

def only_element(element, ls):
    return all([item == element for item in ls])

Время:

$ python -m timeit 'all([item == None for item in a])'
50000 loops, best of 5: 8.81 usec per loop

Использование for цикл:

def only_element(element, ls):
    for item in ls:
        if item != element:
            return False
    return True

Время:

$ python -m timeit 'for item in a:\n    if item != None:\n        break'
100000 loops, best of 5: 9.16 µs per loop 

Использование filter:

def only_element(element, ls):
    return len(list(filter(lambda x: x != element, ls))) == 0

Время:

$ python -m timeit 'len(list(filter(lambda x: x != None, a))) == 0'
10000 loops, best of 5: 20.8 usec per loop

Что взять с собой?

Обычно есть встроенная функция, которая лучше соответствует вашим потребностям и работает быстрее (и с меньшим количеством кода), чем если бы вы использовали for петля.

0 голосов
/ 26 декабря 2018

Самый простой (и не столь эффективный) способ: len(list(filter(lambda direction: mydict[direction] is not None, DIRECTIONS))) == 0

Если вы хотите быть более эффективным и не проходить все элементы в случае, если условие было ложным где-то в середине списка, вы можете использовать takewhile:

from itertools import takewhile len(list(takewhile(lambda direction: mydict[direction] is not None, DIRECTIONS))) == len(DIRECTIONS)

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