Возможно, вы найдете здесь set
.
sentence = "I feel great"
words = sentence.split(" ")
if set("good", "fine", "great").intersects(words):
print("user is good!")
if set("bad", "poorly", "sick").intersects(words):
print("user is bad")
set
представляет собой особый тип контейнера, как list
или dict
. Он игнорирует повторяющиеся записи, но очень быстро проверяет, существует ли элемент. set.intersects
возвращает новый set
который содержит только пункты, найденные с обеих сторон: так, в первом заявлении if
, он возвращает set("great")
, что является «правдивым» (ведет себя как True
в булевом контексте). Второе, если оператор получает пустое множество, которое является «falsey»
Вы можете очистить его с помощью словаря (но вы должны сделать небольшое изменение, я объясню ниже)
responses = {frozenset("good", "fine", "great"): "that's fantastic",
frozenset("bad", "poorly", "sick"): "I hope you feel better!"}
words = sentence.split(" ")
for wordset, reply in responses:
if(wordset.intersects(words):
print(reply)
изменения мы вынуждены были использовать frozenset
, а не set
. Единственное реальное различие, о котором вам нужно беспокоиться, заключается в том, что frozenset
- это неизменный, что означает, что вы не можете добавлять или удалять его членов. По причинам, связанным с осуществлением, dict
ключи должны быть неизменны: вы не можете использовать dict
, list
или set
в качестве ключа: но вы можете использовать tuple
, int
, str
и т.д.
Вы можете получить точно такое же поведение без использования set
: это займет всего пару несколько строк:
responses = {("good", "fine", "great"): "that's fantastic",
("bad", "poorly", "sick"): "I hope you feel better!"}
words = sentence.split(" ")
for wordtuple, reply in responses:
for word in words:
if word in wordtuple:
print(reply)
break
Таким образом, нам нужно еще две линии, и в конечном итоге делает гораздо больше контроля, чем мы на самом деле нужно к. Если есть много возможных слов, чтобы проверить, что может замедлить вашу программу. Это не всегда так плохо, например, вы можете получить responses
, что означает, что вы не будете контролировать эти типы, но если вы знаете, что пишете весь свой собственный код, это хорошо сделать вещи пифонически с самого начала.
Я бы предпочел сделать это с помощью простых '' x '' в ['x', 'y', 'z'] 'вместо того, чтобы вводить разные типы данных, новому программисту, но, тем не менее, хорошее объяснение – taesu
@taesu I верьте в учение, чтобы сделать это * правильно *, а не делать это легко. И 'set' является общим (и полезным) достаточно, чтобы он был встроенным. – RoadieRich
Обучение легко не нужно * неправильный *. Я уверен, что новые программисты будут перегружены всеми этими типами, которые вы бросаете на них. – taesu