在python词典中搜索词典

Pal*_*Dot 3 python iteration search dictionary

我有一本字典词典叫做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}
}
Run Code Online (Sandbox Code Playgroud)

基本上它是格式

{Person Name : Dictionary of that person's attributes}
Run Code Online (Sandbox Code Playgroud)

我试图找到一个工资是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
Run Code Online (Sandbox Code Playgroud)

此方法成功运行

results = search_person_by_attribute("salary", 288589)
print(results)
Run Code Online (Sandbox Code Playgroud)

和打印

['UMANOFF ADAM S','Jack S']
Run Code Online (Sandbox Code Playgroud)

但不知何故,我觉得写这篇文章还有很长的路要走.是否有更好/更短/更pythonic的方式来做它?

如果您还可以提及我的效率(就时间复杂度而言)以及您建议的解决方案将是一个很大的好处.

L3v*_*han 5

我会建议像这样的东西,我认为这不仅仅是更短,而且比你的版本更具可读性:

def search_person_by_attribute(d, attribute, value):
    return [name for name in d if d[name][attribute] == value]
Run Code Online (Sandbox Code Playgroud)

它的工作方式与您的完全一样,但需要将字典作为附加参数,因为我觉得这样的风格更好:

>>> search_person_by_attribute(d, "salary", 288589)
['UMANOFF ADAM S', 'Jack S']
Run Code Online (Sandbox Code Playgroud)