将For循环转换为List Comprehension:测试列表2中的元素是否与列表1中的元素部分匹配

时间:2014-02-09 00:26:20

标签: python list for-loop list-comprehension

有点像这里的python /编程新手,

我已经提出了一个2嵌套for循环的代码来测试第二个循环的元素是否是第一个列表中元素的部分(或完全)匹配,如果是,那么这些元素将从第一个清单。这是代码:

>>> lst = ["my name is Bob Jenkins", "Tommy Cooper I am", "I be Bazil", "I Tarzan"]
>>> names = ["Bob", "Tarzan"]
>>> for l in lst:
        for n in names:
            if n in l:
                lst.remove(l)


>>> print lst
['Tommy Cooper I am', 'I be Bazil']

这里的问题是我实际上并不想修改lst,而是创建一个新列表。因此,列表理解提升了它的头脑。但是,我无法找出列表理解来解决这个问题。我尝试了[i for i in lst for n in names if n not in i],但这不起作用。当然,.remove方法不适用于列表理解。过去一小时我一直在困惑,但无法想出任何事情。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我使用内置函数any

newlst = [i for i in lst if not any(name in i for name in names)]

如果您愿意,使用all的此表达式是等效的:

newlst = [i for i in lst if all(name not in i for name in names)]

答案 1 :(得分:1)

你去:):

lst = ["my name is Bob Jenkins", "Tommy Cooper I am", "I be Bazil", "I Tarzan"]
names = ["Bob", "Tarzan"]

new=[a for a in lst if all(x not in a for x in names) ]
print new

答案 2 :(得分:1)

为了完整性,filter

filter(lambda s: not any(x in s for x in names),lst)
Out[4]: ['Tommy Cooper I am', 'I be Bazil']

对于python 3,list(filter)

list(filter(lambda s: not any(x in s for x in names),lst))
Out[4]: ['Tommy Cooper I am', 'I be Bazil']