【问题标题】:Find keys through values in a dict for Python通过 Python 字典中的值查找键
【发布时间】:2011-02-03 03:09:05
【问题描述】:
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 岁的人的姓名。如何按值搜索字典并返回键?

【问题讨论】:

  • 您的示例数据与您的问题不匹配。你从两个列表开始,而不是字典。如果您的数据以键 = 名称和值 = 年龄的字典类型开始,请执行反向字典查找:此处进行一些讨论 stackoverflow.com/questions/2568673/…
  • 另外,您的名为“name”的函数具有误导性。也许它应该被命名为“名字”,因为大多数年龄都有多个名字。此外,您的数据意味着潜在的问题。尽管实际数据可能不是人名或人的年龄,但在任何大小的数据中,这两个对象很可能不是唯一的。在您的示例中,某一天出生的约翰·史密斯通常可能不止一个。

标签: python dictionary


【解决方案1】:
print [key for (key,value) in nameagedict.items() if value == 19]

nameagedict.items() 为您提供字典中所有项目的列表,作为 (key,value) 元组。

【讨论】:

  • 在 Python 2 中,您通常需要iteritems 而不是items
【解决方案2】:

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

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

【讨论】:

  • 我真正需要的是一个反向查找字典。当然,这只适用于 Key:value 是 1 对 1 关系(从不是 1 对多)的情况。 dict(map(lambda (k,v): (v,k), {1:2, 3:4, 5:6}.items()))
【解决方案3】:

部分解决方案

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

如果你愿意,可以省略 sorted()。您还可以添加 count() 以便数据返回类似

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

如果有 3 个 Cathys 和 7 个 Dans。

虽然上面看起来很短,但我怀疑实际的 for 循环会更少地遍历原始列表。

甚至更好:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 2018-10-07
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多