在python中通过搜索子字符串创建列表

2024-09-28 19:00:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子:

names = ['albert', 'bob', 'charlie']
padded_names = ['albertGARBAGE', 'jamesTRASH', 'bobREFUSE', 'timRUBBISH', 'charlieWASTE']

我想要一个成员为['albertGARBABE', 'bobREFUSE', 'charlieWASTE']的列表

查看其他线程,我看到使用filter()函数完成了类似的任务,但我不知道如何将其应用于列表。我还可以迭代第一个列表并使用str.find(),但我在这方面的运气也很有限

实际上,padded_names是一个列表列表,但我可以操纵它

效率不是我关心的问题,所以难看的解决方案是有效的:)不幸的是,我正在开发的系统仅限于python2.6


Tags: 列表names成员线程单子bobcharliealbert
3条回答

你可以做得很简单:

filtered_list = []
for name in names:
    for padded_name in padded_names:
        if padded_name.find(name) >= 0:
            filtered_list.append(padded_name)

可以转换成一个漂亮的python单行程序:

filtered_list = [padded_name for padded_name in padded_names if any(padded_name.find(name) >= 0 for name in names)]

如果您想使用filter函数,您需要设计自己的方法,根据您的条件返回true:

def test(padded_name):
    names = ['albert', 'bob', 'charlie']
    return any(padded_name.find(name) >= 0 for name in names)        

filtered_names = filter(test,padded_names)

使用list comprehensionstartswith:一个线性

>>> [ x for x in padded_names for y in names if x.startswith(y) ]
['albertGARBAGE', 'bobREFUSE', 'charlieWASTE']

过滤器版本如下所示:

filter( lambda x : any( name in x for name in names ), padded_names )

Filter有两个参数,一个函数(第一个参数)应用于(iterable)数据集(第二个数据集)

这将使用lambda创建一个自定义函数,用于检查名称是否出现在填充的\u名称中的每个名称中

相关问题 更多 >