让我们说我们有一个字典列表,数以千计。每个字典都有完全相同的键,但值不同。
有没有办法查找键值来自哪个词典,然后从同一个词典中访问不同的键值?
例如,假设您有一个列表,其中包含大城市中的每个人,字典格式,如下所示:
people_in_city = [
{'name': 'Bob Jang',
'age': 45,
'sex': 'male'},
{'name': 'Barb Esau',
'age': 56,
'sex': 'female'},
etc.
etc.
现在,你想查找Bob Jang的年龄,但你只有他的名字。无论如何使用这种格式获得相应的年龄?
答案 0 :(得分:3)
在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']
也就是说,关键数据库是制作的那种东西!学习SQL并使用它:)
答案 1 :(得分:1)
我建议按照亚当史密斯的建议来查看数据库。虽然我也想建议看一堂课。那会是这样的:
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
请注意,这仅提供名称的LAST找到值,而不是具有该名称的每个人。必须采用其他方法。此方法还意味着您将所有信息保存在列表中,并且随着列表的增长,这可能会变慢。这就是为什么随着列表的增长,数据库会更好地工作。
作为奖励,可以并行创建每个人。
答案 2 :(得分:0)
(age,) = [v['age' ]for (k,v) in people_in_city.iteritems() if v['name']=="Bob Jang"]
答案 3 :(得分:0)
试试这个,
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']
答案 4 :(得分:0)
people_in_city = [
{'name': 'Bob Jang',
'age': 45,
'sex': 'male'},
{'name': 'Barb Esau',
'age': 56,
'sex': 'female'}]
v = age or name sex etc..
for i in people_in_city:
if v in i.values():
print i
答案 5 :(得分:0)
有一个名为bidict的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'