我正在编写一些代码来减少字符串列表中的单词。如果字符串中单词的最后一个字符是'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']
但这只是返回一个空列表,我可以将其纳入一个工作线吗?
答案 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)