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']
.
中的键之一
一些其他注意事项:
- 隐藏内置函数的名称是不好的做法,例如
list
和 id
。
- 除了
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)
我有一个这样的词典列表。有些数据同时包含名字和姓氏,有些数据只包含名字:
['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']
.
一些其他注意事项:
- 隐藏内置函数的名称是不好的做法,例如
list
和id
。 - 除了
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)