Проверка логики с использованием любого значения из списка? - PullRequest
2 голосов
/ 05 августа 2011
list = ["apples", "oranges", "jerky", "tofu"]

if "chew" in action and list[:] in action:
    print "Yum!"
else:
    print "Ew!"

Как у меня есть логическая проверка, где он проверяет «жевать» в действии, а также любое значение в списке?Например, я хочу напечатать "Yum!"будь то действие "жуй апельсины" или "жуй вяленое мясо".

Ответы [ 5 ]

6 голосов
/ 05 августа 2011

Почему бы не использовать встроенную функцию any()? Мне кажется следующее Pythonic:

foods = ["apples", "oranges", "jerky", "tofu"]

if "chew" in action and any(f in action for f in foods):
    print "Yum!"
else:
    print "Ew!"

Конечно, простой поиск простых подстрок может дать странные результаты. Например, "jerkeyblahchew" будет по-прежнему соответствовать категории "Yum!". Возможно, вы захотите разделить action на слова и искать названия продуктов, которые следуют сразу за "chew" (как @Peter Lyons предлагает в своем ответе для простого случая, когда первые два слова будут "chew X").

Игнорируя порядок, вы могли бы сосредоточиться только на разделенных пробелами словах (и далее игнорировать заглавные / строчные буквы), используя что-то вроде следующего:

foods = ["apples", "oranges", "jerky", "tofu"]
action_words = set(word.lower() for word in action.split())

if "chew" in action_words and any(f in action_words for f in foods):
    print "Yum!"
else:
    print "Ew!"
4 голосов
/ 05 августа 2011
if "chew" in action and action.split()[1] in list:
    print "Yum!"
else:
    print "Ew!"
0 голосов
/ 05 августа 2011

Кажется, что вы хотите выполнить некоторую операцию над множеством (пересечение).

Предположим, action - это базовая строка, содержащая слова:

foods = set(["apples", "oranges", "jerky", "tofu"])
actionWords = set(action.split())

if "chew" in action and foods & actionWords:
    print "Yum!"
else:
    print "Ew!"

оператор & на множестве обозначает пересечение, см. python doc .

0 голосов
/ 05 августа 2011

x in y означает «посмотрите на каждый из элементов y по очереди; равен ли какой-либо из них x?» Таким образом, логика, очевидно, неверна: list (плохая идея для имени переменной, BTW, так как это имя типа) - это список строк, а action - строка - элементы строки буквы, и никакая буква не может быть равна списку строк.

0 голосов
/ 05 августа 2011

Прежде всего, пожалуйста, не используйте список в качестве имени переменной.Это ключевое слово в питоне


_list = ["apples", "oranges", "jerky", "tofu"]
bools = [True for a in action.split() if a in (_list + ["chew"])]
if True in bools:
    print "Yum!"
else:
    print "Ew!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...