簡體   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