简体   繁体   中英

Searching for keys in dict, from list of tuple pairs

I have a question about dictionaries.

food = { 'omlette' : { 'egg': 1, 'ham': 0.2 }, 'soup' : { 'water': 1 , 'vegetables': 2, 'meat': 4 }}

and a list:

order(['omlette', 4])

I want to return the ingredients from dict food(values) times the number of servings needed. So my result should look like this:

{ 'egg': 4.0 , 'ham': 0.8 }

What should I add to this comprehension?

def multi(order):
    return {key for key,value in order if key in food.keys()}

You should be using a dict comprehension , not a set comprehension:

>>> def multi(order):
...     return {k:float(v * order[1]) for k, v in food[order[0]].items()}
...
>>> multi(["omlette", 4])
{'egg': 4.0, 'ham': 0.8}
>>>

iCodez's answer is correct (and I upvoted it :) ). But when comprehensions get this complicated I think it's a good idea to break them down. At least for me it helps me see what's going on better:

def multi(order):
    d = {}
    for k, v in food[order[0]].items():
        d[k] = float(v * order[1])
    return d
>>> def multi(order):
...     if order[0] in food.keys():
...        return { x:float(y*order[1]) for x,y in food[order[0]].items() }
...     else:return "Item not found"
... 
>>> multi(["omlette",4])
{'egg': 4, 'ham': 0.8}

you can aslo check if the item is in food dictionary or not

if you want to pass tuple:

>>> def multi(order):
...     return [ { i:float(j*y) for i,j in food[x.lower()].items() } for x,y in order if x.lower() in food.keys() ]

>>> multi([('omlette', 4),('Soup' ,1)])
[{'egg': 4.0, 'ham': 0.8}, {'water': 1.0, 'vegetables': 2.0, 'meat': 4.0}]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM