2011-02-03 105 views
2
NAMES = ['Alice', 'Bob','Cathy','Dan','Ed','Frank', 
      'Gary','Helen','Irene','Jack', 'Kelly','Larry'] 
AGES = [20,21,18,18,19,20,20,19,19,19,22,19] 

def nameage(a,b): 
    nameagelist = [x for x in zip(a,b)] 
    nameagedict = dict(nameagelist) 

    return nameagedict 

def name(a): 
    for x in nameage(NAMES,AGES): 
     if a in nameage(NAMES,AGES).values(): 
      print nameage(NAMES,AGES).keys() 

print name(19) 

我想返回19岁的人的姓名。如何通过值搜索字典并返回密钥?通过Python的字典中的值查找键值

+0

您的示例数据不匹配你的问题。你从两个列表开始,而不是字典。如果您的数据开始在一个字典的类型,其中键=名称和值=年龄,做一个反向字典查找:一些讨论在这里http://stackoverflow.com/questions/2568673/inverse-dictionary-lookup-python#2568673 – DevPlayer 2015-07-24 01:37:16

+0

你的名字叫“名字”也是误导性的。也许它应该被命名为“名字”,因为大多数年龄段都有多个名字。此外,您的数据意味着潜在的问题。尽管实际的数据可能不是人们的姓名,也不是人的年龄,但在任何大小的数据中,这两个对象很可能不是唯一的。在你的例子中,通常会有一个约翰史密斯在某一天出生。 – DevPlayer 2015-07-24 01:43:35

回答

9
print [key for (key,value) in nameagedict.items() if value == 19] 

nameagedict.items()让你在字典中的所有项目,如(键,值)元组的列表。

+1

在Python 2中,你经常需要`iteritems`而不是`items`。 – 2011-02-03 07:27:51

0

我有类似的问题。这是我的解决方案,它将键和值作为元组数组返回。

filter(lambda (k,v): v==19, nameagedict.items()) 
0

部分解决

names = {age:sorted([name for index,name in enumerate(NAMES) if age == AGES[index]]) for age in sorted(set(AGES))} 
print(names) 

返回:

{18: ['Cathy', 'Dan'], 19: ['Ed', 'Helen', 'Irene', 'Jack', 'Larry'], 20: ['Alice', 'Frank', 'Gary'], 21: ['Bob'], 22: ['Kelly']} 

离开了排序()如果你想。您还可以添加count(),以便数据返回类似于

{18: [('Cathy',3), ('Dan',7), ...} 

如果有3个Cathys和7个Dans。

虽然上面看起来很短,我怀疑一个实际的循环会减少原始列表的迭代次数。

甚至更​​好:

def names(age): 
    index = 0 
    while index < len(AGES): 
     if AGES[index] == age: 
      yield NAMES[index] 
     index += 1 

print('19 year olds') 
for name in names(19): 
    print(name)