如何检测字符串后缀并从列表中移除这些后缀元素? - Python
如何检测字符串的后缀,并从列表中移除这些带后缀的元素?
我知道这看起来像是自然语言处理中的词干提取或词形还原任务,但这个任务需要一个更简单的功能。
假设,我需要移除那些带有 s
和 es
后缀的元素,前提是列表中存在没有后缀的项:
alist = ['bar','barbar','foo','foos','barbares','foofoos','bares']
我想要的输出是:
alist = ['bar','barbar','foo','foofoos']
我尝试了以下方法,但它不奏效,因为当我整理列表时,结果变成了 ['bar', 'barbar', 'barbares', 'bares', 'foo', 'foofoos', 'foos']
,而不是 ['bar', 'bares', 'barbar', 'barbares', 'foo', 'foos', 'foofoos']
alist = ['bar','barbar','foo','foos','barbares','foofoos','bares']
prev = ""
no_s_list = []
for i in sorted(alist):
if i[-2:] == "es" and i[:-2] == prev:
continue
elif i[-1:] == "s" and i[:-1] == prev:
contine
else:
prev = i
no_s_list.append(i)
以上的输出结果是:
>>> sorted(alist)
['bar', 'barbar', 'barbares', 'bares', 'foo', 'foofoos', 'foos']
2 个回答
1
你也可以在这里使用 regex
(正则表达式):
re.split()
会返回类似这样的结果:
barbar
--> ['barbar']
foos
--> ['foo', 's', '']
barbares
--> ['barbar', 'es', '']
foofoos
--> ['foofoo', 's', '']
所以,如果返回的列表长度大于1,并且这个列表的第一个元素在 alist
中找得到,那么你就可以把它去掉。
代码:
In [106]: alist = ['bar','barbar','foo','foos','barbares','foofoos','bares']
In [107]: s=set(alist)
In [108]: for x in s.copy():
sol=re.split(r'(es|s)$',x)
if len(sol)>1 and sol[0] in s:
s.remove(x)
.....:
In [109]: s
Out[109]: set(['bar', 'foofoos', 'barbar', 'foo'])
8
def rm_suffix(s,suffixes):
for suf in suffixes:
if s.endswith(suf):
return s[:-len(suf)]
return s
alist = ['bar','barbar','foo','foos','barbares','foofoos','bares']
salist = set(alist)
suffixes = ('es','s')
blist = [x for x in alist
if (not x.endswith(suffixes)) or (rm_suffix(x,suffixes) not in salist)]
print blist # ['bar', 'barbar', 'foo', 'foofoos']
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。