Python 有没有更好的方法';复杂';列表理解?
我倾向于在Python中大量使用列表理解,因为我认为这是一种生成列表的干净方法,但我经常发现自己在一周后回来想自己“我这么做到底是为了什么?!”这是一个70多个字符的嵌套条件列表理解语句。我想知道我是否应该将其分解为if/elif/else,以及这样做对性能的影响(如果有) 我目前的情况: 调用返回的结构是元组列表。我需要将它转换为一个列表,一些值需要清理,我需要从列表中去掉最后一个元素 e、 g 因此,在本例中,我要删除Python 有没有更好的方法';复杂';列表理解?,python,performance,format,list-comprehension,Python,Performance,Format,List Comprehension,我倾向于在Python中大量使用列表理解,因为我认为这是一种生成列表的干净方法,但我经常发现自己在一周后回来想自己“我这么做到底是为了什么?!”这是一个70多个字符的嵌套条件列表理解语句。我想知道我是否应该将其分解为if/elif/else,以及这样做对性能的影响(如果有) 我目前的情况: 调用返回的结构是元组列表。我需要将它转换为一个列表,一些值需要清理,我需要从列表中去掉最后一个元素 e、 g 因此,在本例中,我要删除RemoveMe,将所有'替换为',并将ChangeMe替换为val2。我
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在风格上更倾向于可读性强,但也更紧凑,不太冗长
任何提示或信息将不胜感激。谢谢大家 这是一种利用字典映射项目进行列表理解的快速方法:
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')]
这是一种利用字典映射项目进行列表理解的快速方法:
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')]
Python只支持一行程序,唯一的条件是这些程序使代码更具可读性,而不是使代码复杂化 在本例中,使用两个嵌套的列表理解、两个相邻的三元运算符、一个列表切片,所有这些都在一行上,超过100个字符。。。它几乎是可读的 有时最好使用经典for循环
result = []
for val, space, item, remove in response:
result.append([val, '', 'val2'])
然后你意识到你可以把它写成一个更容易理解的列表(假设你的过滤条件很简单):
请记住,每个代码都编写一次,但是它被多次读取Python只支持一个行程序,唯一的条件是这些行程序使代码更可读,而不是使代码复杂化 在本例中,使用两个嵌套的列表理解、两个相邻的三元运算符、一个列表切片,所有这些都在一行上,超过100个字符。。。它几乎是可读的 有时最好使用经典for循环
result = []
for val, space, item, remove in response:
result.append([val, '', 'val2'])
然后你意识到你可以把它写成一个更容易理解的列表(假设你的过滤条件很简单):
请记住,每段代码都是写一次,但它是读很多次那么短,那么容易理解+1:)感谢您的输入,谢谢!是的,这几乎就是我在列表中得到的,理解可以很快变得复杂,只需要几个条件,变得不可读。我同意for循环+简单理解更容易理解。部分解包。但是,性别问题是一个简短的、可理解的列表+1:)感谢您的输入,谢谢!是的,这几乎就是我在列表中得到的,理解可以很快变得复杂,只需要几个条件,变得不可读。我同意for循环+简单理解更容易理解。部分解包。性感