[英]Having trouble understanding List Comprehension in Python
我试图根据我今天在这里看到的另一个问题来理解列表理解。 我已经自定义并简化了上一个问题的代码,因此它并不明显相同。 我正在尝试逐步将此代码转换为一组传统的嵌套 for 循环,以帮助我理解它:
employee_records = [('group1', {'values': []}),
('group2',
{'values': [
{'employee': {'name': 'Joseph', 'id': 103, 'displayName': 'Joe'}, 'category': 'Title1'},
{'employee': {'name': 'Robert', 'id': 114, 'displayName': 'Bob'}, 'category': 'Title2'}
]}
),
('group3',
{'values': [
{'employee': {'name': 'Rachel', 'id': 1563, 'displayName': 'Rach'}, 'category': 'title3'}
]}
)]
employee_details = [[nested_list[0], x['employee']['name'], x['category']]
for nested_list in employee_records
for x in nested_list[1]["values"]]
print(employee_details)
output如下:
[['group2', 'Joseph', 'Title1'], ['group2', 'Robert', 'Title2'], ['group3', 'Rachel', 'title3']]
当我将其(根据我的理解)翻译成一组嵌套的 for 循环时,我得到了不同的结果:
employee_records = [('group1', {'values': []}), ('group2', {'values': [\
{'employee': {'name': 'Joseph', 'id': 103, 'displayName': 'Joe'}, 'category': 'Title1'}, \
{'employee': {'name': 'Robert', 'id': 114, 'displayName': 'Bob'}, 'category': 'Title2'}]}), \
('group3', {'values': [{'employee': {'name': 'Rachel', 'id': 1563, 'displayName': 'Rach'}, 'category': 'title3'}]})]
department = []
for nested_list in employee_records:
for x in nested_list[1]['values']:
department.append([[nested_list][0], x['employee']['name'], x['category']])
print(department)
Output:
[[('group2', {'values': [{'employee': {'name': 'Joseph', 'id': 103, 'displayName': 'Joe'}, 'category': 'Title1'}, {'employee': {'name': 'Robert', 'id': 114, 'displayName': 'Bob'}, 'category': 'Title2'}]}), 'Joseph', 'Title1'], [('group2', {'values': [{'employee': {'name': 'Joseph', 'id': 103, 'displayName': 'Joe'}, 'category': 'Title1'}, {'employee': {'name': 'Robert', 'id': 114, 'displayName': 'Bob'}, 'category': 'Title2'}]}), 'Robert', 'Title2'], [('group3', {'values': [{'employee': {'name': 'Rachel', 'id': 1563, 'displayName': 'Rach'}, 'category': 'title3'}]}), 'Rachel', 'title3']]
当我对此进行故障排除时,我能够通过将 append 语句更改为更具体地针对第一个元素来获得预期结果:
employee_records = [('group1', {'values': []}), ('group2', {'values': [\
{'employee': {'name': 'Joseph', 'id': 103, 'displayName': 'Joe'}, 'category': 'Title1'}, \
{'employee': {'name': 'Robert', 'id': 114, 'displayName': 'Bob'}, 'category': 'Title2'}]}), \
('group3', {'values': [{'employee': {'name': 'Rachel', 'id': 1563, 'displayName': 'Rach'}, 'category': 'title3'}]})]
department = []
for nested_list in employee_records:
for x in nested_list[1]['values']:
department.append([[nested_list][0][0], x['employee']['name'], x['category']])
print(department)
Output:
[['group2', 'Joseph', 'Title1'], ['group2', 'Robert', 'Title2'], ['group3', 'Rachel', 'title3']]
为什么在将其重构为嵌套 for 循环时需要将nested_list[0]
更改为nested_list[0][0]
?
你问
为什么我需要将 nested_list[0] 更改为 nested_list[0][0]
但是您的程序不执行nested_list[0]
,而是执行[nested_list][0]
,这只是nested_list
的一种复杂表达方式。
进一步来说,
你的理解是:
employee_details = [
[
nested_list[0],
x['employee']['name'],
x['category']
]
for nested_list in employee_records
for x in nested_list[1]["values"]
]
当你 for 循环正在做的时候:
employee_details = []
for nested_list in employee_records:
for x in nested_list[1]['values']:
employee_details.append([
[nested_list][0], ## <--- extra []
x['employee']['name'],
x['category']
])
我想我发现了你的小问题。
对于您的第一次试用:
for nested_list in employee_records:
for x in nested_list[1]['values']:
department.append([[nested_list][0], x['employee']['name'], x['category']])
print(department)
您正在附加nested_list
变量列表的列表,这实际上导致了不同的 output。只需从nested_list
中删除列表,您将获得与列表理解相同的结果。
for nested_list in employee_records:
for x in nested_list[1]['values']:
department.append([nested_list[0], x['employee']['name'], x['category']])
print(department)
列表理解的外部方块与append([])
的工作方式相同
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.