使用条件删除列表中的元素

Posted

技术标签:

【中文标题】使用条件删除列表中的元素【英文标题】:Remove element in a list with condition 【发布时间】:2012-12-24 09:11:35 【问题描述】:

我有一个名为 Info 的类,其中 Info 有一个字符串类型的实例变量,Info.getName() 可以访问它

我还有一个实例信息列表,例如class_list = [Info('Aleck'), Info('John')]

给定一个name_list = ['Aleck', 'Bob'],我想删除class_list 中name_list 中同名的元素,同时我还需要知道一个名字(例如Bob)是否不在class_list 中(例如打印出那个bob不在列表中)

对于上面的例子,结果应该是 class_list = [Info('John')] 并打印出 bob 不在列表中。

我知道这样做的丑陋方式,例如以下代码(我实际上并没有运行它,只是一个示例),是否有优雅或 Pythonic 的方式来做到这一点?

def removeElement(name_list, class_list):
    list_to_be_removed = []
    for name in name_list:
        is_name_in_list = false
        for obj in class_list
            if name == obj.getName():
                list_to_be_removed.add(obj)
                is_name_in_list = true
                break
        if is_name_in_list == false:
            print name + ' is not in the list'
        is_name_in_list = false

    for obj in list_to_be_removed:
        class_list.remove(obj)

【问题讨论】:

我认为您将类与实例混淆了。 另外,class 是一个关键字,所以一堆代码不会运行。 抱歉,我没有注意到我使用了保留字“class”,已修改。 【参考方案1】:

你没有类,你有类实例。 Info('Alice') 是一个构造函数调用,它创建 Info 类的一个实例。

这个怎么样:

filtered = [info for info in info_list if info.get_name() not in name_list]

或者:

filtered = filter(lambda o: o not in name_list, info_list)

如果您有很多名称,请将您的 name_list 转换为一个集合并使用它。

name_set = set(name_list)

【讨论】:

我明白你的意思了,非常感谢。以您的方式,我可以获得过滤列表。然后我应该有另一个代码来获取 name_list 中的名称,它不会删除 info_list 中的任何内容。真的很感谢。【参考方案2】:

列表推导是你的朋友。

def remove_names(names_to_remove, info_list):
    return [info
            for info in info_list
            if info.getName() not in names_to_remove]

我将大多数变量的名称更改为更接近我认为您的意思。

【讨论】:

以上是关于使用条件删除列表中的元素的主要内容,如果未能解决你的问题,请参考以下文章

Python 中如何删除一个列表 List 中多个符合条件的元素

有条件地从 Java 8 中的列表中删除元素 [重复]

Python 中如何删除一个列表 List 中多个符合条件的元素

python数组中怎样删除符合条件的元素

根据条件删除列表元素

python数组中怎样删除符合条件的元素