繁体   English   中英

在 Python 中无法理解列表理解

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM