jla*_*hut 0 python format performance list-comprehension
我倾向于在Python中使用列表理解,因为我认为它是一种生成列表的简洁方法,但我常常发现自己一周后回来并自言自语"我到底为此做了什么?!" 它是一个70多个字符的嵌套条件列表理解语句.我想知道如果我应该将其分解为if/elif/else,以及性能影响(如果有的话),它是否达到某一点.
我目前的情况:
从调用返回的结构是元组列表.我需要将它转换为列表,需要清理一些值,我需要从列表中删除最后一个元素.
例如
[(val1, ' ', 'ChangeMe', 'RemoveMe),
(val1, ' ', 'ChangeMe', 'RemoveMe),
(val1, ' ', 'ChangeMe', 'RemoveMe)]
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,我想删除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]`
Run Code Online (Sandbox Code Playgroud)
嵌套的多条件理解语句是否令人不悦?我知道风格上Python更喜欢可读性,但也很紧凑,而不是冗长.
任何提示或信息将不胜感激.谢谢大家!
Python倾向于单行,唯一的条件是这些使代码更具可读性,而不是使它复杂化.
在这种情况下,你使用两个嵌套列表理解,两个相邻的三元运算符,一个列表切片,所有这一切都在一行超过100个字符......这是一切但可读.
有时候使用经典的for循环会更好.
result = []
for val, space, item, remove in response:
result.append([val, '', 'val2'])
Run Code Online (Sandbox Code Playgroud)
然后你意识到你可以把它写成列表理解更容易理解(假设你的过滤条件很简单):
result = [[val, '', 'val2'] for val, *_ in response]
Run Code Online (Sandbox Code Playgroud)
请记住,每个代码都会写一次,但会多次读取.