筛选和修改列表理解中的字符串

时间:2018-08-06 11:04:33

标签: python list-comprehension

我有一个代码,可以使用列表理解来过滤字符串列表中的元素。像这样:

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)

但是它看起来确实很丑陋。还有更优雅的吗?

4 个答案:

答案 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] ]