Python当字典列表包含不同的键时,如何使用if else? (按键错误)

Python when a list of dictionaries includes different keys, how to use if else? (key error)

我有一个这样的词典列表。有些数据同时包含名字和姓氏,有些数据只包含名字:

['info': {'id': 'abc', 'age':23, 'firstname':'tom', 'lastname':'don', 'phone': 1324}]
['info': {'id': 'cde', 'age':24, 'firstname':'sara', 'lastname':'man', 'phone': 1324}]
['info': {'id': 'cdd', 'age':22, 'firstname':'sam', 'phone': 1324}]
['info': {'id': 'fff', 'age':25, 'firstname':'mary', 'phone': 1324}]

有一个库和函数可以根据其 id 检索数据。我需要获取数据并制作数据集。 'Lastname' 是比较重要的数据。如果 'lastname' 不存在,我想得到 'firstname',所以我写了如下代码,但它不起作用。

ids = ['abc', 'cde', 'cdd', 'fff']

list = [] 
for id in ids:
    data = library.function(id)
    if data['info']['lastname'] in data['info']:
        new_list1 = [data['info']['id'], data['info']['lastname'], data['info']['phone']]
        list.append(new_list1)
    else:
        new_list2 = [data['info']['id'], data['info']['firstname'], data['info']['phone']]
        list.append(new_list2)
print(list)

我仍然得到 keyError:

KeyError: 'lastname'  

我该如何修复代码?或者对于这样的案例有什么提示吗? 提前致谢!

解决问题的最常见或最简单的方法是异常处理。检查名字的代码应该在 try 块内。这样做的目的是,如果计算机遇到异常,它不会触发异常,而是执行 Except 块。您可以通过简单的搜索获得更多信息。

代码:

try:
    if data['info']['lastname'] in data['info']:
        new_list1 = [data['info']['id'], data['info']['lastname'], data['info']['phone']]
        list.append(new_list1)
except KeyError:
    new_list2 = [data['info']['id'], data['info']['firstname'], data['info']['phone']]
        list.append(new_list2)

当然你也可以直接替换为:

if data['info']['lastname'] in data['info']:

与:

if 'lastname' in data['info'].keys():

这会检查键是否 'lastname' 然后执行姓氏搜索

最好的方法是检查键是否存在,而不是键中是否存在值。

而不是

if data['info']['lastname'] in data['info']:

试试这个:

if 'lastname' in data['info']:

这一行:

if data['info']['lastname'] in data['info']:

...并不像您想象的那样。它尝试实际检索存储在 data['info']['lastname'] 的值,然后查看 that 是否包含在 data['info'] 中。你想要的是:

if 'lastname' in data['info']:

...检查字符串 'lastname' 是否是 data['info'].

中的键之一

一些其他注意事项:

  • 隐藏内置函数的名称是不好的做法,例如 listid
  • 除了 data['info'] 之外,您似乎没有访问 data 的任何其他部分,因此您可以通过仅将该部分分配给变量来稍微简化代码。
  • 在这种情况下,我建议使用字典的 get 方法,如果请求的键存在,它可以检索一个值,否则 return 一个默认值。

完成所有处理后,您的代码可能如下所示:

ids = ['abc', 'cde', 'cdd', 'fff']

people = [] 
for person_id in ids:
    data = library.function(person_id)['info']
    # Assigns name to the lastname if it exists in the dict, or else
    # assigns it to firstname
    name = data.get('lastname', data['firstname'])
    people.append([data['id'], name, data['phone']])

print(people)