【问题标题】:How to Implement A Basic Search in Dicts [duplicate]如何在字典中实现基本搜索[重复]
【发布时间】:2017-02-27 19:50:04
【问题描述】:

我有一个如下的字典列表:

[
    {"name":"Some", "surname":"Body","age":22},
    {"name":"Some", "surname":"One", "age":23},
    {"name":"Any", "surname":"Body", "age":20}
]

我需要一个函数来搜索字典,如下所示:

def search(data:dict, **kwargs):
    pass

search(mydict, surname="Body")
[
    {"name":"Some", "surname":"Body","age":22},
    {"name":"Any", "surname":"Body", "age":20}
]

search(mydict, name="Some")
[
    {"name":"Some", "surname":"Body","age":22},
    {"name":"Some", "surname":"One", "age":23}
]

search(mydict, age=23)
[
    {"name":"Any", "surname":"Body", "age":20}
]

我怎样才能做到这一点?


环境

  • Python 3.5

【问题讨论】:

  • 如果您真的想在search 中传递键值对的组合,这可能更有趣...
  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 on topichow to ask 在这里申请。 StackOverflow 不是设计、编码或教程服务。
  • 这就是我使用**kwargs的原因?
  • 是的,您的示例并不建议您这样做。我们无法准确猜测您想要什么。最好是尽力说明您的问题。例如,您是否希望保留这些键、值对中的任何?还是全部他们?
  • IMO,这可能不是骗局,因为骗局目标中的案例不是多值的

标签: python algorithm dictionary search


【解决方案1】:

这是使用all 测试包含kwargs 中确切键值的字典的一种方法:

lst = [
    {"name":"Some", "surname":"Body","age":22},
    {"name":"Some", "surname":"One", "age":23},
    {"name":"Any", "surname":"Body", "age":20}
]


def search(data:dict, **kwargs):
    return [d for d in data if all(d[k]==v for k, v in kwargs.items())] 

print(search(lst, surname="Body", age=22))
# [{'name': 'Some', 'age': 22, 'surname': 'Body'}]

您可以使用dict的.get方法来处理丢失的键,然后默认传递一个哨兵对象:

def search(data:dict, **kwargs):
    return [d for d in data if all(d.get(k, object())==v for k, v in kwargs.items())]

【讨论】:

  • 我可能倾向于使用all(d.get(k, object()) == v....
  • @juanpa.arrivillaga 不错。谢谢!
猜你喜欢
  • 2018-11-10
  • 2014-12-14
  • 2015-10-15
  • 2013-01-06
  • 2023-03-07
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多