Есть ли способ проверки членства по значениям словаря? После подтверждения можем ли мы сделать что-то еще?

1

Я понимаю, что довольно легко проверить, доступен ли ключ в словаре, но как насчет определенных значений?

Итак, у меня здесь есть словарь списков, где ключ ссылается на набор, для последовательности, строки. Это выглядело бы примерно так:

menu = {'breakfast':['soft-boiled eggs', 'hash brown', 'Earl Grey'], 
        'lunch':['pasta', 'soup'], 
        'dinner':['chips', 'beef stew', 'veggies']}

Теперь то, что я хотел бы сделать, это проверить, находится ли, скажем, 'chips' в моем меню, и если это так, я хотел бы заменить его на 'crusty bread'. Я знаю, что могу попробовать использовать 'chips' in menu['lunch'] или то же самое для завтрака, но что, если я не знаю, когда он будет подан?

Extension

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

class Food(object):
def __init__(self, meal):
    self.meal = meal
    self.ingredients = collections.defaultdict(set)
def __str__(self):
    return "%s" %(self.meal)

Здесь meal будет означать завтрак, обед или ужин. И мы имеем ingredients, который является словарем множеств. 'potatoes' - это ингредиент, и при нажатии у нас появятся соответствующие блюда: хеш-коричневые, чипсы. Таким образом, когда я вызываю print meal, menu[meal].ingredients для своей функции, я получаю следующий результат (это только на завтрак, так как все, что я вложил):

breakfast defaultdict(<type 'set'>, {'potatoes': set(['chips', 'hash brown']), 'eggs': set(['omelette', 'hard-boiled', 'soft-boiled']), 'tea': set(['Assam', 'Earl Grey', 'English'])})

Итак, это в основном то, что доступно для завтрака для определенных "ингредиентов".

Теперь, допустим, худшее произошло, и у меня кончился картофель! Теперь я хочу заменить 'potatoes' на 'bread', в котором я буду иметь значения/типы 'roll', 'crusty', 'brown'. Как можно это сделать?

И, прежде всего, к обеденному перерыву, мы выбегаем из чая 'Assam'. Как и вопрос перед расширением, как бы удалить его (после проверки, чтобы убедиться, что он существует в первую очередь)?

  • 2
    Ваш пример с завтраком любопытен: картофель используется в чипсах и т. Д., Яйца используются в омлетах и т. Д., Чай используется в Ассаме, Эрл Грей и т. Д. Таким образом, клиенты получают одни и те же чайные листья независимо от того, какой чай они заказывают? Это упражнение, кажется, домашнее задание из колледжа гостеприимства Василия Фолти :-)
  • 1
    Почему это помечено как «весело»?
Показать ещё 7 комментариев
Теги:
dictionary

3 ответа

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

Членство в menu легко:

[k for k, v in menu.iteritems() if 'chips' in v]

Членство с defaultdict работает точно так же, поскольку проверка герметичности не мутирует его.

  • 0
    Это случайное понимание списка, которое вы использовали?
  • 0
    Это. Поскольку существует множество возможных ответов, нам нужна какая-то структура, которая будет возвращать их все.
0

Похоже, что основная вещь, о которой вы просите, - это повторение итерации через словарь - как только у вас есть это, все это основное.

for key,value in mydict.iteritems():
    print "%s = %s" %(key, value)

теперь, чтобы применить его непосредственно к вашей ситуации:

for meal, food in menu.iteritems():
    if 'potatoes' in food.ingredients:
        del food.ingredients['potatoes']
        food.ingredients['bread'] = set(['roll', 'crusty', 'brown'])

'del' может использоваться для удаления пары ключ/значение из словаря

0

Один очевидный способ - просто пройти через весь dict и заменить значения, но IMO лучше его спроектировать, чтобы было легко заменить ингредиенты, например. иметь один объект (может быть одноточечный класс) для каждого типа ингредиентов, поэтому вы можете просто заменить типы на лету, например.

tea.remove('assam')

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

registry.replace(potato, bread)

Ещё вопросы

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