有更好的方法来进行“复杂”列表理解吗?

问题描述 投票:0回答:3

我倾向于在 Python 中大量使用列表理解,因为我认为这是一种生成列表的干净方法,但我经常发现自己一周后回来并思考自己 “我这样做到底是为了什么?!” 这是一个 70 多个字符的嵌套条件列表理解语句。我想知道是否到了一定程度,我是否应该将其分解为 if/elif/else,以及性能影响(如果这样做)。

我现在的情况:

调用返回的结构是元组列表。我需要将其转换为列表,需要清理一些值,并且需要从列表中删除最后一个元素。

例如

[(val1, ' ', 'ChangeMe', 'RemoveMe),
 (val1, ' ', 'ChangeMe', 'RemoveMe),
 (val1, ' ', 'ChangeMe', 'RemoveMe)]

所以在这种情况下,我想删除

RemoveMe
,将所有
' '
替换为
''
,并将
ChangeMe
替换为
val2
。我知道这是很多变化,但我返回的数据有时很糟糕,我无法控制我收到的响应内容。

我目前有类似的东西:

response = cursor.fetchall()
response = [['' if item == ' ' else item if item != 'ChangeMe' else 'val2' for item in row][:-1] for row in response]`

嵌套多条件理解语句是否令人不悦?我知道从风格上来说,Python 更喜欢可读性强,但也紧凑而不是冗长。

任何提示或信息将不胜感激。谢谢大家!

python performance format list-comprehension
3个回答
5
投票

Python 偏爱单行代码,唯一的条件是它们使代码更具可读性,而不是让它变得复杂。

在这种情况下,您使用两个嵌套列表理解、两个相邻的三元运算符、一个列表切片,所有这些都在超过 100 个字符的单行上......这一切都难以阅读。

有时最好使用经典的 for 循环。

result = []
for val, space, item, remove in response:
    result.append([val, '', 'val2'])

然后您意识到您可以将其编写为更容易理解的列表理解(假设您的过滤条件很简单):

result = [[val, '', 'val2'] for val, *_ in response]

记住,每个代码都是写一次,但它是读很多次


0
投票

这是一种使用字典来映射项目进行列表理解的快速方法:

response = [('val1', ' ', 'ChangeMe', 'RemoveMe'), ('val1', ' ', 'ChangeMe', 'RemoveMe'), ('val1', ' ', 'ChangeMe', 'RemoveMe')]
map_dict = {' ': '', 'ChangeMe': 'val2', 'val1': 'val1'}

response = [tuple(map_dict[x] for x in tupl if x != 'RemoveMe') for tupl in response]
# [('val1', '', 'val2'), ('val1', '', 'val2'), ('val1', '', 'val2')]                                                   

0
投票

通过添加lookup_dict可以轻松扩展到多个更改的值

response = [('val1', ' ', 'ChangeMe', 'RemoveMe'), ('val1', ' ', 'ChangeMe', 'RemoveMe'), ('val1', ' ', 'ChangeMe', '删除我')] Lookup_dict = {' ': '', 'ChangeMe': 'val2'}

[ [lookup_dict[item] if item inlookup_dict else item for item in row][:-1] for row in response]

© www.soinside.com 2019 - 2024. All rights reserved.