首页 > 解决方案 > 将多 for 循环 if/else 转换为列表理解

问题描述

我正在尝试将其转换为列表理解。

当前代码

some_list = [[{"apple":"red"}, {"orange":"orange"}, {"pineapple":"yellow"}, [{"box":"brown"}, {"table":"grey"}, {"seat":"green"}], {"grapes":"purple"}, {"cherry":"red"}]]

category_list = []
for item in some_list:
    tag_list = []
    for elem in item:
        if isinstance(elem, list):
            for x in elem:
                tag_list.append(x)
        else:
            tag_list.append(elem)
            
    category_list.append(tag_list)
    
category_list

期望的输出

[[{'apple': 'red'},
  {'orange': 'orange'},
  {'pineapple': 'yellow'},
  {'box': 'brown'},
  {'table': 'grey'},
  {'seat': 'green'},
  {'grapes': 'purple'},
  {'cherry': 'red'}]]

我的尝试

[[x for x in elem] if isinstance(elem, list) else elem for item in some_list for elem in item]

结果

[{'apple': 'red'},
 {'orange': 'orange'},
 {'pineapple': 'yellow'},
 [{'box': 'brown'}, {'table': 'grey'}, {'seat': 'green'}],
 {'grapes': 'purple'},
 {'cherry': 'red'}]

但这只是让我回到我开始的地方。

标签: pythonlist-comprehension

解决方案


试试这个理解:

some_list = [[{"apple":"red"}, {"orange":"orange"}, {"pineapple":"yellow"}, [{"box":"brown"}, {"table":"grey"}, {"seat":"green"}], {"grapes":"purple"}, {"cherry":"red"}]]

categories = [x if type(x) == dict else y for x in some_list[0] for y in x]

print(categories)
# Prints 
# [{'apple': 'red'}, {'orange': 'orange'}, {'pineapple': 'yellow'}, 
# {'box': 'brown'}, {'table': 'grey'}, {'seat': 'green'}, 
# {'grapes': 'purple'}, {'cherry': 'red'}]

如果它是字典,则附加元素,否则附加元素中的每个元素(这将是一个列表)。

注意:我实际上是列表理解的新手,所以如果我犯了任何错误,请告诉我!


推荐阅读