我有两个清单:
names = ['albert', 'bob', 'charlie']
padded_names = ['albertGARBAGE', 'jamesTRASH', 'bobREFUSE', 'timRUBBISH', 'charlieWASTE']
我想要一个成员为['albertGARBABE', 'bobREFUSE', 'charlieWASTE']
查看其他主题,我看到使用filter()
函数完成了类似的任务,但我不知道如何将其应用于列表。我也可以迭代第一个列表并使用str.find()
,但我也没有运气。
实际上,padded_names
是一个列表列表,但我可以操纵它。
效率不是我的关注,所以丑陋的解决方案是有效的:)不幸的是,我正在研究的系统仅限于python 2.6。
答案 0 :(得分:0)
你可以很简单地做到:
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)]
如果你想使用过滤器功能,你需要设计自己的方法,在你的条件下返回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)
答案 1 :(得分:0)
过滤器版本如下所示:
filter( lambda x : any( name in x for name in names ), padded_names )
Filter有两个参数,一个函数(1st arg),你正在应用于(可迭代的)数据集(第二组)。
这使用lambda创建一个自定义函数,用于检查名称是否出现在padded_names中的每个名称中。
答案 2 :(得分:0)
使用list comprehension
和startswith
:一个班轮
>>> [ x for x in padded_names for y in names if x.startswith(y) ]
['albertGARBAGE', 'bobREFUSE', 'charlieWASTE']