Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Dicts中实现基本搜索_Python_Algorithm_Dictionary_Search - Fatal编程技术网

Python 如何在Dicts中实现基本搜索

Python 如何在Dicts中实现基本搜索,python,algorithm,dictionary,search,Python,Algorithm,Dictionary,Search,我有一份目录如下: [ {"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":"Som

我有一份目录如下:

[
    {"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}
]
我需要一个函数,它可以在dicts上进行搜索,如下所示:

[
    {"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

这里有一种方法,使用
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
方法处理缺少的键,然后将sentinel对象作为默认值传递:

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

如果您确实想在
搜索中传递键、值对的组合,这可能更有趣…欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。在这里申请。StackOverflow不是设计、编码或教程服务。这就是为什么我使用了
**kwargs
?是的,你的例子并不建议你这样做。我们也猜不出你到底想要什么。最好是尽最大努力说明问题所在。例如,是否希望保留这些键、值对中的任何一个?或者全部?依我看,这可能不是dupe,因为dupe目标中的情况不是多值的。我可能倾向于使用
all(d.get(k,object())==v…
@juanpa.arrivillaga Nice one。谢谢!