修剪字符串列表中的单词

时间:2017-11-07 09:03:50

标签: python

我正在编写一些代码来减少字符串列表中的单词。如果字符串中单词的最后一个字符是't'或's',则将其删除,如果第一个字符为'x',则将其删除。

words = ['bees', 'xerez']

应该返回:

['bee', 'erez']

到目前为止,我的解决方案是:

trim_last = [x[:-1] for x in words if x[-1] == 's' or 't']   

我认为这可以减少最后一个字符。然后我修剪第一个字符,如果它们是'x'用这一行:

trim_first = [x[1:] for x in trim_last if x[0] == 'x'] 

但这只是返回一个空列表,我可以将其纳入一个工作线吗?

7 个答案:

答案 0 :(得分:4)

[v.lstrip('x').rstrip('ts') for v in words]

答案 1 :(得分:3)

你正在做一个过滤器,而不是一个映射。 正确的方法是

trim_first = [x[1:] if x.startswith('x')  else x for x in trim_last]

此外,您的解决方案不应返回空列表,因为过滤器将匹配第二个元素

答案 2 :(得分:2)

使用re.sub()功能的一步:

import re

words = ['bees', 'xerez']
result = [re.sub(r'^x|[ts]$', '', w) for w in words]

print(result)

输出:

['bee', 'erez']

答案 3 :(得分:1)

只是为了加入 - 因为这实际上是一个映射:

map(lambda x: x[1:] if x[0] == 'x'  else x, words)

答案 4 :(得分:1)

如果您正在寻找单行,您可以使用一些算术来进行列表切片:

words = ['bees', 'xerez', 'xeret']
[w[w[0] == 'x' : len(w) - int(w[-1] in 'st')] for w in words]
# output: ['bee', 'erez', 'ere']

答案 5 :(得分:0)

您可以尝试以下代码:

trim_last = [x.lstrip('x').rstrip('t').rstrip('s') for x in words]

答案 6 :(得分:0)

为什么你使用两个列表理解,你可以使用一个列表理解:

  

一线解决方案:

words = ['bees', 'xerez','hellot','xnewt']

print([item[:-1] if item.endswith('t') or item.endswith('s') else item for item in [item[1:] if item.startswith('x') else item for item in words]])

输出:

['bee', 'erez', 'hello', 'new']
  

上面列表理解的解释:

final=[]
for item in words:
    sub_list=[]
    if item.endswith('t') or item.endswith('s'):
        sub_list.append(item[:-1])
    else:
        sub_list.append(item)
    for item in sub_list:
        if item.startswith('x'):
            final.append(item[1:])
        else:
            final.append(item)

print(final)