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的方式来做它?
如果您还可以提及我的效率(就时间复杂度而言)以及您建议的解决方案将是一个很大的好处.
我会建议像这样的东西,我认为这不仅仅是更短,而且比你的版本更具可读性:
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)