Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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 查找键值来自的字典_Python - Fatal编程技术网

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…},}类似这样的内容?