查找字典的关键值来自

时间:2015-04-01 06:59:50

标签: python

让我们说我们有一个字典列表,数以千计。每个字典都有完全相同的键,但值不同。

有没有办法查找键值来自哪个词典,然后从同一个词典中访问不同的键值?

例如,假设您有一个列表,其中包含大城市中的每个人,字典格式,如下所示:

people_in_city = [

        {'name': 'Bob Jang',
        'age': 45,
        'sex': 'male'},
        {'name': 'Barb Esau',
        'age': 56,
        'sex': 'female'},
        etc.
        etc.

现在,你想查找Bob Jang的年龄,但你只有他的名字。无论如何使用这种格式获得相应的年龄?

6 个答案:

答案 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'