检查列表元素是否存在于另一个lis的元素中

2024-09-29 21:33:27 发布

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

我在名单上有点麻烦。所以,基本上,我有一个清单:

a=["Britney spears", "red dog", "\xa2xe3"]

我还有另外一张单子,看起来像:

^{pr2}$

我想做的是检查a中的元素是否是b中某个元素的一部分,如果是的话,将它们从b的元素中删除。所以,我希望b看起来像:

b = ["cat","dog","is stupid","good stuff","awesome"]

实现这一点的最具Python式(2.7.x)方式是什么?在

我假设我可以循环检查每个元素,但我不确定这是否非常有效-我有一个大小约为50k的列表(b


Tags: 元素isredcat单子awesomebritneygood
3条回答

好吧,我不知道这算不算Python,既然reduce被流放到了Python3中的functools,就得有人把一句话放在桌面上:

a = ["Britney spears", "red dog", "\xa2xe3"]
b = ["cat","dog","red dog is stupid", "good stuff \xa2xe3", "awesome Britney spears"]

b = [reduce(lambda acc, n: acc.replace(n, ''), a, x).strip() for x in b]

甚至更快

^{pr2}$

但随着可读性的降低,我认为它越来越少了。在

这里有一个处理transferred dogcatcher情况的程序。我借用了mgilson的regex,但我觉得没关系,因为它很简单:-):

def reducer(acc, n):
    if n in acc:
        return re.sub('(?:\s+|^)' + re.escape(n) + '(?:\s+|$)', '', acc)
    return acc

b = [reduce(reducer, a, x).strip() for x in b]

为了可读性,我将lambda提取到一个命名函数中。在

好吧,最简单的是直接的列表理解,只要a很小,它甚至是一个非常有效的方法。在

b = [i for i in b if i not in a]

我想我应该在这里使用正则表达式:

import re

a=["Britney spears", "red dog", "\xa2xe3"]

regex = re.compile('|'.join(re.escape(x) for x in a))

b=["cat","dog","red dog is stupid", "good stuff \xa2xe3", "awesome Britney spears"]

b = [regex.sub("",x) for x in b ]
print (b)  #['cat', 'dog', ' is stupid', 'good stuff ', 'awesome ']

通过这种方式,正则表达式引擎可以优化备选方案列表的测试。在

这里有一系列的替代方法来展示不同的regex的行为。在

^{pr2}$

相关问题 更多 >

    热门问题