有没有办法从字典的值检查成员资格?一旦确认,我们可以做其他事吗?

时间:2010-02-21 04:21:31

标签: python dictionary

我知道检查字典中是否有密钥很容易,但某些值是什么?

所以,我在这里有一个列表字典,其中键引用了一组,为了一致性,字符串。看起来有点像这样:

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',我将拥有值{/ 1}}。怎么会这样做呢?

最重要的是,在午餐时间,我们用尽了'roll', 'crusty', 'brown'茶。类似于扩展之前的问题,我将如何删除它(在检查它是否存在于第一位之后)?

3 个答案:

答案 0 :(得分:2)

menu中的成员资格很简单:

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

defaultdict的成员资格完全相同,因为包容性检查不会改变它。

答案 1 :(得分:0)

一个显而易见的方法是通过整个dict并替换值,但IMO最好设计它,以便更换成分,例如对于每种类型的成分都有一个单独的对象(可能是单例类),因此您可以随时替换类型。

tea.remove('assam')

它将影响所有提到茶的地方。同样,你可以跟踪正在使用茶的膳食,在某种注册表和更新注册表,如果你想要从所有的饭菜中取出茶或可能是标志茶被删除,或想要用面包取代马铃薯,那样做在注册表中,反过来可以要求每餐都这样做

registry.replace(potato, bread)

答案 2 :(得分: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'可用于从字典中删除键/值对