In article <264c1144-5d04-4ad0-aa32-f4e6770d2...@googlegroups.com>, rafaella...@gmail.com wrote:
> i have a dictionary with names and ages for each name. I want to write a > function that takes in an age and returns the names of all the people who are > that age. > please help Homework problem? In any case, this is a classic example of a real-life problem, and thus worth exploring. The general case is you have a many-to-one mapping and you want to find the inverse one-to-many map. I'm assuming when you say, "a dictionary with names and ages for each name", you mean the names are the keys and the ages are the values. That would also imply that the names are unique; that's a poor assumption for real data sets, but let's assume that's the case here. So, we're going to take your original dictionary and create a new one where the keys are the ages, and the values are lists of names. That's pretty straight forward. Here's the most brute-force way (which is a good place to start): d2 = {} for name, age in d1.items(): if age not in d2: d2[age] = [] d2[age].append(name) Work through that code in your head to convince yourself that you understand what's going on. This is such a common pattern, Python has a neat tool to make this easier. It's called a defaultdict. Bascially, this is a dictionary which has built into it the "if key doesn't exist, initialize something" logic. It works like this: from collections import defaultdict d2 = defaultdict(list) for name, age in d1.items(): d2[age].append(name) The "defaultdict(list)" creates one of these and tells it that the "initialize something" part should be "create an empty list". It's hugely convenient and used all the time. -- https://mail.python.org/mailman/listinfo/python-list