我知道检查字典中是否有密钥很容易,但某些值是什么?
所以,我在这里有一个列表字典,其中键引用了一组,为了一致性,字符串。看起来有点像这样:
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'
茶。类似于扩展之前的问题,我将如何删除它(在检查它是否存在于第一位之后)?
答案 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'可用于从字典中删除键/值对