在Python字典的字典中搜索

3
我有一个叫做 data_dict 的字典嵌套字典。以下是它的样子:
{'UMANOFF ADAM S': {'total_stock_value': 'NaN', 'loans': 'NaN', 'salary': 288589},
'YEAP SOON': {'total_stock_value': 192758, 'loans': 'NaN', 'salary': 'NaN'},
'PIPER GREGORY F': {'total_stock_value': 880290, 'loans': 1452356, 'salary': 19791},
'Jack S': {'total_stock_value': 88000, 'loans': 'NaN', 'salary': 288589}
}

基本上它的格式是这样的:
{Person Name : Dictionary of that person's attributes}

我将尝试查找薪资为X的人的姓名。具体来说,在上面的例子中,假设我正在寻找薪资为288589的人的姓名。我期望找到所有薪资为288589的人的姓名。
我编写了以下通用函数,该函数将接收搜索键和值,并返回符合该键和值条件的人员姓名。
def search_person_by_attribute(attribute, value):
    person_names = []

    for person, attributes_dict in data_dict.items():
        if attributes_dict[attribute] == value:
            person_names.append(person)

    return person_names

这个方法顺利执行。
results = search_person_by_attribute("salary", 288589)
print(results)

并打印

['UMANOFF ADAM S','Jack S']

但是我觉得这种写法有点冗长。是否有更好/更短/更符合Python风格的方法呢?

如果您还能提及我的解决方案和您建议的解决方案的效率(以时间复杂度为衡量标准),那将是一个很大的优势。


1
如果你经常这样做,为什么不创建一个新的字典,格式为 {salary: (name1, name2)} - Chris_Rands
@PaleBlueDot 这只是在性能和内存之间的一种妥协。 - Jean-François Fabre
@PaleBlueDot 如果数据集非常大,使用真正的数据库可能在效率方面更好。 - L3viathan
@Jean-FrançoisFabre 确切地说 :-) - Ravindra S
@L3viathan 数据集很大,但不至于需要真正的数据库。 - Ravindra S
显示剩余2条评论
1个回答

5
我建议使用类似这样的语句,我认为它不仅更简短,而且比你的版本更易读:
def search_person_by_attribute(d, attribute, value):
    return [name for name in d if d[name][attribute] == value]

它的工作方式与您的完全相同,但需要将字典作为附加参数传递,因为我认为这样更好:
>>> search_person_by_attribute(d, "salary", 288589)
['UMANOFF ADAM S', 'Jack S']

@Chris 这只是O(人数),因为字典访问是O(1),但是确实仍然是线性的。 - L3viathan
这看起来确实更好。尽管在接受它为最佳答案之前,我会等一段时间。此外,我怀疑任何搜索的效率/时间复杂度方面都不会比O(人数) 更好。 - Ravindra S
@PaleBlueDot 如果你在之前进行了所有的搜索,例如制作一个反向字典,那么它们可以是O(1),这样你就可以只需执行reversed_dict["salary"][288589],但如果你还想保留原始字典,那么你需要大约两倍的内存空间。 - L3viathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接