Генератор в if-заявлении в python - PullRequest
5 голосов
/ 06 августа 2010

Или как в операторе if в измененном списке.

Я уже некоторое время читаю StackOverflow (спасибо всем). Я люблю это. Я также видел, что вы можете оставить вопрос и ответить на него самостоятельно. Извините, если я дублирую, но я не нашел этот конкретный ответ в StackOverflow.


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

Моя проблема:

myList = ["Foo", "Bar"]
if "foo" in myList:
  print "found!"

Поскольку я не знаю регистр элемента в списке, я хочу сравнить его со списком в нижнем регистре. Очевидный, но безобразный ответ будет:

myList = ["Foo", "Bar"]
lowerList = []

for item in myList:
  lowerList.append(item.lower())

if "foo" in lowerList:
  print "found!"

Могу ли я сделать это лучше?

Ответы [ 5 ]

8 голосов
/ 06 августа 2010
if any(s.lower() == "foo" for s in list): print "found"
1 голос
/ 06 августа 2010

Это объединяет преимущества памяти выражения генератора с выигрышем в скорости от удаления дубликатов:

if "foo" in (s.lower() for s in set(list)): print "found"
1 голос
/ 06 августа 2010

Понимание списка:

mylist = ["Foo", "Bar"]
lowerList = [item.lower() for item in mylist]

Затем вы можете сделать что-то вроде if "foo" in lowerlist или полностью обойти временную переменную с помощью if "foo" in [item.lower() for item in mylist]

0 голосов
/ 06 августа 2010

Пожалуйста, не используйте список в качестве имени переменной, вот версия, которая помещает генератор в переменную и демонстрирует, что генерация остановилась после нахождения ответа и не исчерпала генератор:

list_to_search = ["Foo", "Bar"]
lowergen = (item.lower() for item in list_to_search)
if "foo" in lowergen:
  print "found!"
print next(lowergen), 'is next after it'
0 голосов
/ 06 августа 2010

Как насчет:

theList = ["Foo", "Bar"]
lowerCaseSet = set(x.lower for x in theList)

if "foo" in lowerCaseSet:
   print "found"

Кстати.Вы не должны вызывать переменную list, так как это слово уже используется типом list.

...