Как определить, есть ли элемент в списке?

1
thelist = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}]

Как я могу сказать:

If "red" is in thelist and time does not equal 2 for that element (that we just got from the list):
  • 0
    Есть ли разница в скорости между ответом «wallacoloo» и ответом «понимание списка» / «python»?
Теги:
list

6 ответов

13
Лучший ответ

Используя any(), чтобы узнать, есть ли элемент, удовлетворяющий условиям:

>>> any(item['color'] == 'red' and item['time'] != 2  for item in thelist)
False
  • 0
    это приятно! Правильно ли я понимаю, что круглые скобки any () удваиваются как генератор, поэтому any () оценивает элемент понимания списка по элементу и возвращает True, как только находит элемент, который удовлетворяет критериям?
  • 1
    Это «генераторное выражение», доступное в разумной версии Python (начиная с версии 2.4). Можно также написать any([...]) чтобы получить классическое понимание списка. (см. python.org/dev/peps/pep-0289 для получения дополнительной информации о выражениях генератора)
Показать ещё 1 комментарий
1
def colorRedAndTimeNotEqualTo2(thelist):
    for i in thelist:
        if i["color"] == "red" and i["time"] != 2:
            return True
    return False

print colorRedAndTimeNotEqualTo2([{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}])

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

Спасибо за уловку, Бенсон.

  • 0
    избили до удара на 30 секунд - это именно то, что я бы сделал. За исключением того, чтобы просто быть в привычке Python 3: print (i)
  • 1
    Это выполнимо, но использование цикла for означает, что если бы было более одного элемента с цветом == red и time! = 2, вы бы напечатали дважды.
0
for val in thelist:
    if val['color'] == 'red' and val['time'] != 2:
        #do something here

Но это не похоже на правильную структуру данных.

0

Ну, нет ничего такого элегантного, как "найти", но вы можете использовать понимание списка:

matches = [x for x in thelist if x["color"] == "red" and x["time"] != 2]
if len(matches):
    m = matches[0]
    # do something with m

Однако я нахожу [0] и len() утомительным. Я часто использую цикл for с срезом массива, например:

matches = [x for x in thelist if x["color"] == "red" and x["time"] != 2]
for m in matches[:1]:
    # do something with m
  • 0
    Я предполагал, что "максимум один" вид находки. Если вы хотите, чтобы все совпадения, я бы предпочел ответ чужой.
0
list = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}]
for i in list:
  if i['color'] == 'red' && i['time'] != 2:
    print i
  • 0
    Возможно, это слишком придирчиво, но я рекомендую вам избегать называть вещи «списком», потому что в какой-то момент вам может понадобиться доступ к конструктору списка, и было бы стыдно перезаписать его.
  • 0
    Python использует «и» вместо «&&»
0

Вы можете выполнять большую часть манипулирования списками в понимании списка. Здесь один, который составляет список раз для всех элементов, где красный цвет. Тогда вы можете спросить, существует ли 2 в те времена.

thelist = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}]
reds = ( x['time'] == 2 for x in thelist if x['color'] == red )
if False in reds:
  do_stuff()

Вы можете конденсировать это еще больше, исключив переменную "reds" следующим образом:

thelist = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}]
if False in ( x['time'] == 2 for x in thelist if x['color'] == red ):
  do_stuff()
  • 0
    это требует 2 поиска вместо 1 (один, чтобы получить элемент, другой, чтобы найти False). это также требует больше оперативной памяти (понимание списка может привести к огромным результатам). итерация будет более эффективной
  • 0
    Я переключился на генераторские понимания, а не на списочные, поскольку (как сказал jspcal) списки были ненужными.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню