假设我有这个:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
通过搜索“Pam”作为名称,我想检索相关的字典:{name:“Pam”,年龄:7}
如何做到这一点?
假设我有这个:
[
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
通过搜索“Pam”作为名称,我想检索相关的字典:{name:“Pam”,年龄:7}
如何做到这一点?
当前回答
简单地使用列表理解:
[i for i in dct if i['name'] == 'Pam'][0]
示例代码:
dct = [
{'name': 'Tom', 'age': 10},
{'name': 'Mark', 'age': 5},
{'name': 'Pam', 'age': 7}
]
print([i for i in dct if i['name'] == 'Pam'][0])
> {'age': 7, 'name': 'Pam'}
其他回答
简单地使用列表理解:
[i for i in dct if i['name'] == 'Pam'][0]
示例代码:
dct = [
{'name': 'Tom', 'age': 10},
{'name': 'Mark', 'age': 5},
{'name': 'Pam', 'age': 7}
]
print([i for i in dct if i['name'] == 'Pam'][0])
> {'age': 7, 'name': 'Pam'}
people = [
{'name': "Tom", 'age': 10},
{'name': "Mark", 'age': 5},
{'name': "Pam", 'age': 7}
]
def search(name):
for p in people:
if p['name'] == name:
return p
search("Pam")
将接受的答案放在函数中,以便于重用
def get_item(collection, key, target):
return next((item for item in collection if item[key] == target), None)
也可以写成
get_item_lambda = lambda collection, key, target : next((item for item in collection if item[key] == target), None)
结果
key = "name"
target = "Pam"
print(get_item(target_list, key, target))
print(get_item_lambda(target_list, key, target))
#{'name': 'Pam', 'age': 7}
#{'name': 'Pam', 'age': 7}
如果键可能不在目标字典中,请使用dict。get和避免KeyError
def get_item(collection, key, target):
return next((item for item in collection if item.get(key, None) == target), None)
get_item_lambda = lambda collection, key, target : next((item for item in collection if item.get(key, None) == target), None)
你可以使用生成器表达式:
>>> dicts = [
... { "name": "Tom", "age": 10 },
... { "name": "Mark", "age": 5 },
... { "name": "Pam", "age": 7 },
... { "name": "Dick", "age": 12 }
... ]
>>> next(item for item in dicts if item["name"] == "Pam")
{'age': 7, 'name': 'Pam'}
如果你需要处理不存在的项,那么你可以做用户Matt在他的评论中建议的事情,并使用稍微不同的API提供默认值:
next((item for item in dicts if item["name"] == "Pam"), None)
并且要查找项目的索引,而不是项目本身,您可以枚举()列表:
next((i for i, item in enumerate(dicts) if item["name"] == "Pam"), None)
你可以通过使用Python中的filter和next方法来实现这一点。
方法过滤给定序列并返回一个迭代器。 Next方法接受迭代器并返回列表中的下一个元素。
所以你可以通过,
my_dict = [
{"name": "Tom", "age": 10},
{"name": "Mark", "age": 5},
{"name": "Pam", "age": 7}
]
next(filter(lambda obj: obj.get('name') == 'Pam', my_dict), None)
输出是,
{'name': 'Pam', 'age': 7}
注意:如果没有找到所搜索的名称,上述代码将返回None。