如果元素以另一个列表中的元素结尾,则从列表中删除元素的结尾
Delete end of element from a list if the element ends with an element from another list
我有以下两个列表。如果 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']
为了获得更好的 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)
这是一种使用 Regex 的方法。
例如:
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))
一行列表理解:
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
对应于每个元素的精简版本或未修改的元素本身。
我有以下两个列表。如果 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']
为了获得更好的 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)
这是一种使用 Regex 的方法。
例如:
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))
一行列表理解:
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
对应于每个元素的精简版本或未修改的元素本身。