Есть ли способ проверки членства по значениям словаря? После подтверждения можем ли мы сделать что-то еще? - PullRequest
1 голос
/ 21 февраля 2010

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

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

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'. Как и в случае с вопросом перед расширением, как я могу удалить это (после проверки, чтобы увидеть, существует ли оно в первую очередь)?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2010

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

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

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

0 голосов
/ 21 февраля 2010

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

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 голосов
/ 21 февраля 2010

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

tea.remove('assam')

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

registry.replace(potato, bread)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...