我有一个代码,可以使用列表理解来过滤字符串列表中的元素。像这样:
def get_items(items):
return [item for item in items if not item.startswidth('some_prefix') and not (item == 'bad_string' or item.endswith('bad_postfix') of 'bad_substr' in item) and not ites.endswidth('another_bad_postfix')]
现在我不仅要过滤,还希望修改项目,并且对于每个项目都应使用此斜体:
if item.startswith('./'):
item = item[2:]
执行此操作的pythonic方法是什么?令人讨厌的是,我可以将其从理解中重写为简单的循环,例如:
for item in items:
res = []
if not item.startswidth('some_prefix') and not (item == 'bad_string' or item.endswith('bad_postfix') of 'bad_substr' in item) and not ites.endswidth('another_bad_postfix'):
break
if item.startswith('./'):
item = item[2:]
res.append(item)
但是它看起来确实很丑陋。还有更优雅的吗?
答案 0 :(得分:1)
您可以使用以下方法将其塞入理解范围:
return [item[2:] if item.startswith('./') else item for item in ...
但是请注意,以这种方式编写的理解有些难以理解。您可以在单独的函数中分离出项目条件:
def item_is_good(item):
return( not item.startswidth('some_prefix') and
not (item == 'bad_string' or
item.endswith('bad_postfix') of
'bad_substr' in item) and
not item.endswidth('another_bad_postfix') )
理解力
[item[2:] if item.startswith('./') else item for item in items if item_is_good(item)]
答案 1 :(得分:1)
我认为这样看起来会更好:
def get_items(items):
return [
item[2:] if item.startswith('./') else item
for item in items
if not item.startswidth('some_prefix') and not (item == 'bad_string' or item.endswith('bad_postfix') of 'bad_substr' in item) and not ites.endswidth('another_bad_postfix')
]
答案 2 :(得分:0)
您始终可以使用map()
和filter()
方法来提高代码的可读性。
Here您可以找到有关地图和过滤器方法的示例。
首先,您可以使用filter方法来过滤列表中的项目。然后,您可以使用地图功能进行所需的修改。
答案 3 :(得分:-1)
使用嵌套列表理解:
def get_items():
return [item[2:] if item[:2] == './' else item for item in [your_list_comprehension] ]