有没有办法从字典的值中检查成员身份?一旦确认,我们还能做其他事情吗?

2024-09-30 02:35:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道检查字典中是否有键是很容易的,但是某些值呢?你知道吗

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

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

虽然这很难解释,但假设我们有一个叫做食物的类,定义如下:

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'])})

所以这基本上就是早餐中提供的特定“配料”。你知道吗

现在,让我们假设最坏的情况已经发生了,我的土豆用完了!我现在想做的是用'bread'替换'potatoes',在这个替换下我将有值/类型'roll', 'crusty', 'brown'。你要怎么做呢?你知道吗

最重要的是,临近午餐时间,我们喝光了'Assam'茶。与扩展之前的问题类似,我如何删除它(在检查它是否首先存在之后)?你知道吗


Tags: self字典hasheggsmenusoftsetingredients
3条回答

加入menu很容易:

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

使用defaultdict的成员身份的工作方式完全相同,因为包含检查不会改变它。你知道吗

一个很明显的方法是遍历整个dict并替换值,但在我看来,更好的方法是将其设计为便于替换成分,例如,每种成分都有一个单独的对象(可能是singleton类),因此您可以动态地替换类型,例如

tea.remove('assam')

它会影响到所有提到茶的地方。同样地,您可以在某种注册表中跟踪正在使用茶的膳食,如果您想从所有膳食中删除茶,或者可能将茶标记为已删除,或者想用面包替换土豆,则可以在注册表中执行该操作,这反过来可以要求每顿膳食执行该操作

registry.replace(potato, bread)

看起来你所要求的最基本的东西是,一旦你有了字典,就可以反复阅读,这都是最基本的东西。你知道吗

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”可用于从字典中删除键/值对

相关问题 更多 >

    热门问题