如果元素以另一个列表中的元素结尾,则从列表中删除该元素的结尾



我有以下两个列表。如果my_list以扩展名中的扩展名结尾,则应将其删除。我似乎找不到不需要太多代码行的解决方案。

输入:

my_list = ['abc_sum_def_sum', 'abc_sum_def_mean', 'abc_sum', 'abc_abc']
extensions = ['_sum', '_mean']

输出:

new_list = ['abc_sum_def', 'abc_sum_def', 'abc', 'abc_abc']

单行列表理解:

new_list = [min(e[:(-len(ext) if e.endswith(ext) else len(e))] for ext in extensions) for e in my_list]

结果:

['abc_sum_def', 'abc_sum_def', 'abc', 'abc_abc']

解释:

它所做的基本上是循环my_list,检查它的元素e是否在其末尾有两个extensions项中的任何一个。如果是这样,它会修剪该扩展部分。如果没有,则保留my_list元素不变。它基本上首先执行此操作(不应用min(:

[[e[:(-len(ext) if e.endswith(ext) else len(e))] for ext in extensions] for e in my_list]

它产生:

[['abc_sum_def', 'abc_sum_def_sum'],
['abc_sum_def_mean', 'abc_sum_def'],
['abc', 'abc_sum'],
['abc_abc', 'abc_abc']]

然后应用min来收集每对中较小的项目。该min对应于每个元素的精简版本或未触及的元素本身。

为了获得更好的pythonic方法,您可以将其转换为列表理解:

my_list = ['abc_sum_def_sum','abc_sum_def_mean','abc_sum','abc_abc']
extensions = ['_sum','_mean']
new_list =[]
for x in my_list:
for elem in extensions:
if x.endswith(elem):
y = x[:-len(elem)]
new_list.append(y)

这是使用正则表达式的一种方法。

前任:

import re
my_list = ['abc_sum_def_sum','abc_sum_def_mean','abc_sum','abc_abc']
extensions = ['_sum','_mean']
pattern = re.compile(r"(" + "|".join(extensions) + r")$")
print([pattern.sub("", i) for i in my_list])

输出:

['abc_sum_def', 'abc_sum_def', 'abc', 'abc_abc']
my_list = ['abc_sum_def_sum','abc_sum_def_mean','abc_sum','abc_abc']
extensions = ['_sum','_mean']
new_list =[]
for x in my_list:
if x.endswith(extensions[0]) or x.endswith(extensions[1]):
if x.endswith(extensions[0]):
y = x[:-len(extensions[0])]
new_list.append(y)
else:
y = x[:-len(extensions[1])]
new_list.append(y)
else:
new_list.append(x)

print(new_list)

输出:

['abc_sum_def', 'abc_sum_def', 'abc', 'abc_abc']

使用 lambda 的解决方案:

my_list = ['abc_sum_def_sum','abc_sum_def_mean','abc_sum','abc_abc']
extensions = ['_sum','_mean']
def ext_cleaner(extensions, str_arg):
ext_found = [ext for ext in extensions if str_arg.endswith(ext)]
ret = str_arg[:-len(ext_found[0])] if ext_found else str_arg
return ret
list(map(lambda x: ext_cleaner(extensions, x), my_list))

最新更新