我有以下两个列表。如果 my_list以 extensions 的扩展名结尾,则应将其删除。我似乎找不到不需要太多代码行的解决方案。
输入:
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)
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']
这是使用正则表达式的一种方法。
前任:
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']
使用 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))