Я понимаю, что довольно легко проверить, доступен ли ключ в словаре, но как насчет определенных значений?
Итак, у меня здесь есть словарь списков, где ключ ссылается на набор, для последовательности, строки. Это выглядело бы примерно так:
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'
. Как и вопрос перед расширением, как бы удалить его (после проверки, чтобы убедиться, что он существует в первую очередь)?
Членство в menu
легко:
[k for k, v in menu.iteritems() if 'chips' in v]
Членство с defaultdict
работает точно так же, поскольку проверка герметичности не мутирует его.
Похоже, что основная вещь, о которой вы просите, - это повторение итерации через словарь - как только у вас есть это, все это основное.
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' может использоваться для удаления пары ключ/значение из словаря
Один очевидный способ - просто пройти через весь dict и заменить значения, но IMO лучше его спроектировать, чтобы было легко заменить ингредиенты, например. иметь один объект (может быть одноточечный класс) для каждого типа ингредиентов, поэтому вы можете просто заменить типы на лету, например.
tea.remove('assam')
и это затронет все места, где был отправлен чай. аналогичным образом вы можете отслеживать питание, в котором использовался чай, в каком-то реестре и обновлении реестра, если вы хотите удалить чай из всех блюд или, возможно, чай с флагом, удаленный или хотите заменить картофель хлебом, сделайте это в реестре, который, в свою очередь, может попросить каждую еду сделать это.
registry.replace(potato, bread)