Проблема с проверкой, существуют ли созданные пользователем элементы списка в предварительно созданном списке - PullRequest
0 голосов
/ 07 октября 2018

Так что новичок в Python и только начал отрабатывать потенциалы.Здесь пользователь вводит ингредиенты, которые им не нужны в пище.Но проблема возникает, когда метод работает с несколькими опциями, а с остальными - нет.Вот код:

menu = []
pepper = "pepper"
salt = "salt"
meat = "meat"
chicken = "chicken"
tomato = "tomato"
cucumber = "cucumber"
tye = "tye"
food_1 = [pepper, salt, meat]
food_2 = [chicken, tomato, cucumber]
food_3 = [pepper, chicken, tomato]
food_4 = [salt, tomato, cucumber]
food_5 = [meat, tomato]
food_6 = [pepper, tye]
# pepper is used 3 times.
# salt is used 2 times,
# meat is used 2 times.
# chicken is used 2 times.
# tomato is used 4 times.
# cucumber is used 2 times.
# tye is used 1 time.
menu.append(food_1)
menu.append(food_2)
menu.append(food_3)
menu.append(food_4)
menu.append(food_5)
menu.append(food_6)

bad_ingredients = ""
removed_from_meal = []
while bad_ingredients is not "0":
    bad_ingredients = input("Please tell me what foods you don't like. When you're finished, type 0 to quit this: ")
    removed_from_meal.append(bad_ingredients)
    if removed_from_meal.__contains__("0"):
        removed_from_meal.remove("0")  # removing the 0 used to exit the loop from the list.
print("You have asked to remove {} from your food.".format(removed_from_meal))

for food in menu:
    if any(elem in removed_from_meal for elem in food):
        menu.remove(food)
print("You can now choose {} foods from the menu.".format(len(menu)))

Возьмите, к примеру, «перец», и он работает.Даже когда я закомментирую те, которые не содержат его, количество выводимых пунктов меню будет правильным.Но некоторые как «помидор», кажется, не следуют.Я сделал списки в этом порядке, чтобы использовать их позже в определенных печатных строках.Пользовательский список также не работает достаточно хорошо, если в «remove_from_meal» есть более одного элемента, но я считаю, что это связано с первой проблемой.

1 Ответ

0 голосов
/ 07 октября 2018

Здесь:

for food in menu:
    if any(elem in removed_from_meal for elem in food):
       menu.remove(food)

Вы модифицируете (.remove()) список, по которому вы перебираете.Это ваша (основная) проблема.

Чтобы упростить проблему, рассмотрите следующий код:

lst = [1,2,3,4,5,6,7,8,9,10]

for x in lst:
    print(x)
    if x == 2:
        print("Removing 2")
        lst.remove(x)

Какие выходные данные:

1
2
Removing 2
4
5
6
7
8
9
10

Что произошлодо 3? Он был "пропущен", потому что вы изменили список, перебирая его.(На самом деле, удалив 2, вы сместили индекс 3).

Вы можете изменить это на что-то вроде:

acceptable_meals = []
for meal in menu:
    if not any(food in removed_from_meal for food in meal):
        acceptable_meals.append(meal)

или

acceptable_meals = []
for meal in menu:
    if any(food in removed_from_meal for food in meal):
        continue
    acceptable_meals.append(meal)

При этом, я мог бы изменить весь объект, чтобы он выглядел примерно так:

pepper = "pepper"
salt = "salt"
meat = "meat"
chicken = "chicken"
tomato = "tomato"
cucumber = "cucumber"
tye = "tye"

# We can define the menu all at once, as a list of lists, instead of appending 
#   multiple separate sublists.
menu = [
    [pepper, salt, meat],
    [chicken, tomato, cucumber],
    [pepper, chicken, tomato],
    [salt, tomato, cucumber],
    [meat, tomato],
    [pepper, tye]
]

removed_from_meal = []
while True:
    bad_ingredient = input("Please tell me what foods you don't like. When you're finished, type 0 to quit this: ")
    if bad_ingredient == "0":
        break
    # Otherwise, add it to the food "blacklist"
    removed_from_meal.append(bad_ingredient)

print("You have asked to remove {} from your meal.".format(removed_from_meal))

# Create a new list, which we'll populate if none of the food it contains is blacklisted
acceptable_meals = []
for meal in menu:
    if not any(food in removed_from_meal for food in meal):
        acceptable_meals.append(meal)

print("You can now choose {} meals from the menu:".format(len(acceptable_meals)))
for meal in acceptable_meals:
    print(meal)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...