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

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 对应于每个元素的精简版本或未修改的元素本身。