4

我有以下两个列表。如果 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']
4

5 回答 5

3

单行列表理解:

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

于 2019-11-29T08:09:56.920 回答
2

要获得更好的 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)
于 2019-11-29T07:30:25.973 回答
1
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']
于 2019-11-29T07:42:20.483 回答
1

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

前任:

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']
于 2019-11-29T07:39:21.150 回答
0

使用 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))
于 2019-11-29T07:53:44.633 回答