Reputation: 39
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()}
Upvotes: 0
Views: 92
Reputation: 19753
>>> 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}]
Upvotes: 0
Reputation: 18891
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
Upvotes: 1
Reputation:
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}
>>>
Upvotes: 3