Python 查找键值来自的字典
假设我们有一个字典列表,有数千种。每个字典都有完全相同的键,但值不同 有没有办法查找键值来自哪个字典,然后从同一个字典访问不同的键值 例如,假设您有一个包含大城市中每个人的列表,字典格式,如下所示:Python 查找键值来自的字典,python,Python,假设我们有一个字典列表,有数千种。每个字典都有完全相同的键,但值不同 有没有办法查找键值来自哪个字典,然后从同一个字典访问不同的键值 例如,假设您有一个包含大城市中每个人的列表,字典格式,如下所示: people_in_city = [ {'name': 'Bob Jang', 'age': 45, 'sex': 'male'}, {'name': 'Barb Esau', 'age': 56, '
people_in_city = [
{'name': 'Bob Jang',
'age': 45,
'sex': 'male'},
{'name': 'Barb Esau',
'age': 56,
'sex': 'female'},
etc.
etc.
现在,你想查找Bob Jang的年龄,但你只有他的名字。用这种格式可以得到他相应的年龄吗?在Python中没有快速的方法。我的建议是:
def get_dict_from_key(list_of_dicts, key, value):
return next((d for d in list_of_dicts if d[key] == value))
result_d = get_dict_from_key(dicts, 'name', 'Bob Jang')
result_d['age']
class Person():
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
people_in_city = []
def add_person(name, age, gender
people_in_city=people_in_city):
people_in_city.append(Person(name, age, gender))
def find_by_name(name):
for person in people_in_city:
if person.name == name:
return person
也就是说,这就是关系数据库的用途!学习SQL并使用它:在Python中没有快速的方法可以做到这一点。我的建议是:
def get_dict_from_key(list_of_dicts, key, value):
return next((d for d in list_of_dicts if d[key] == value))
result_d = get_dict_from_key(dicts, 'name', 'Bob Jang')
result_d['age']
(age,) = [v['age' ]for (k,v) in people_in_city.iteritems() if v['name']=="Bob Jang"]
class Person():
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
people_in_city = []
def add_person(name, age, gender
people_in_city=people_in_city):
people_in_city.append(Person(name, age, gender))
def find_by_name(name):
for person in people_in_city:
if person.name == name:
return person
也就是说,这就是关系数据库的用途!学习SQL并使用它:试试这个
(age,) = [v['age' ]for (k,v) in people_in_city.iteritems() if v['name']=="Bob Jang"]
provided_name = 'some name'
persons_list_with_name = [person_info in person_info in people_in_city if person_info['name'] == provided_name]
for person_info in persons_list_with_name:
print person_info['name'], person_info['age']
试试这个
provided_name = 'some name'
persons_list_with_name = [person_info in person_info in people_in_city if person_info['name'] == provided_name]
for person_info in persons_list_with_name:
print person_info['name'], person_info['age']
我建议像亚当·斯密建议的那样查看数据库。不过我也建议你看一门课。那会是这样的:
def get_dict_from_key(list_of_dicts, key, value):
return next((d for d in list_of_dicts if d[key] == value))
result_d = get_dict_from_key(dicts, 'name', 'Bob Jang')
result_d['age']
class Person():
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
people_in_city = []
def add_person(name, age, gender
people_in_city=people_in_city):
people_in_city.append(Person(name, age, gender))
def find_by_name(name):
for person in people_in_city:
if person.name == name:
return person
这不是最优雅的方式,但它完成了任务,而且您可以添加更多信息,而不必改变搜索功能的性质。假设你找到了亲爱的“Bob Jang”,你意识到你想知道他正在做的工作,假设你把它编码到了课堂上。你只要做:
person_of_interest = find_by_name('Bob Jang')
person_of_interest.job
person_of_interest.age
请注意,这只给出名称的最后一个找到的值,而不是该名称的所有人。为此,必须采用其他方法。此方法还意味着您正在保存列表中的所有信息,并且随着列表的增长,这可能会变慢。这就是为什么随着列表的增长,数据库会工作得更好
作为奖励,可以并行创建每个人。我建议按照亚当·斯密的建议查看数据库。不过我也建议你看一门课。那会是这样的:
def get_dict_from_key(list_of_dicts, key, value):
return next((d for d in list_of_dicts if d[key] == value))
result_d = get_dict_from_key(dicts, 'name', 'Bob Jang')
result_d['age']
class Person():
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
people_in_city = []
def add_person(name, age, gender
people_in_city=people_in_city):
people_in_city.append(Person(name, age, gender))
def find_by_name(name):
for person in people_in_city:
if person.name == name:
return person
这不是最优雅的方式,但它完成了任务,而且您可以添加更多信息,而不必改变搜索功能的性质。假设你找到了亲爱的“Bob Jang”,你意识到你想知道他正在做的工作,假设你把它编码到了课堂上。你只要做:
person_of_interest = find_by_name('Bob Jang')
person_of_interest.job
person_of_interest.age
请注意,这只给出名称的最后一个找到的值,而不是该名称的所有人。为此,必须采用其他方法。此方法还意味着您正在保存列表中的所有信息,并且随着列表的增长,这可能会变慢。这就是为什么随着列表的增长,数据库会工作得更好
作为奖励,可以并行创建每个人。有一个名为的python包可以做到这一点。它提供了一个双向dict,允许您从值中获取键或从键中获取值。文档中的一个示例:
>>> element_by_symbol = bidict(H='hydrogen')
>>> element_by_symbol['H'] # forward mapping works just like with dict
'hydrogen'
>>> element_by_symbol[:'hydrogen'] # use slice for the inverse mapping
'H'
有一个名为的python包可以做到这一点。它提供了一个双向dict,允许您从值中获取键或从键中获取值。文档中的一个示例:
>>> element_by_symbol = bidict(H='hydrogen')
>>> element_by_symbol['H'] # forward mapping works just like with dict
'hydrogen'
>>> element_by_symbol[:'hydrogen'] # use slice for the inverse mapping
'H'
循环浏览列表,比较名称,如果名称匹配,则表明您已找到词典。如果您定期按名称查找,请创建一个词典{name:{…data…},}类似这样的内容?循环浏览列表,比较名称,如果名称匹配,则表明您已找到词典。如果您定期按名称查找,请创建一个词典{name:{…data…},}类似这样的内容?