【问题标题】:Searching in python dictionary of dictionaries在字典的python字典中搜索
【发布时间】:2017-10-02 14:16:36
【问题描述】:

我有一本名为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']

但不知何故,我觉得写这篇文章的路还很长。有没有更好/更短/更蟒蛇的方式来做到这一点?

如果您还可以提及我的效率(在时间复杂度方面)以及您建议的解决方案将是一个很大的奖励。

【问题讨论】:

  • 您可以根据需要创建一个专门的词典,使用当前词典作为输入。
  • 如果你经常这样做,为什么不创建一个格式为{salary: (name1, name2)} 的新字典?
  • @Jean-FrançoisFabre & Chris_Rands 不是真的。我在问题中以薪水为例。数据集很大,我需要搜索各种属性而不仅仅是薪水。在这里创建一个新字典不是一个好主意。 :-)
  • @PaleBlueDot 这只是性能和内存之间的妥协
  • @PaleBlueDot 如果数据集很大,使用真实的数据库在效率方面可能会更好。

标签: python dictionary search iteration


【解决方案1】:

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

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(number_of_people),因为字典访问是 O(1),但是是的,仍然是线性的。
  • 这绝对看起来更好。虽然我会等待一段时间才能接受它作为最佳答案。我也怀疑这种搜索的任何解决方案在效率/时间复杂度方面都会比 O(number_of_people) 更好。
  • @PaleBlueDot 如果您之前进行了所有搜索,即如果您制作了一个反向字典,那么您可以只做reversed_dict["salary"][288589],那么它会是 O(1),但是您如果您还想保留原始字典,则需要大约两倍的内存空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
相关资源
最近更新 更多