删除条件列表中的元素

时间:2013-01-10 03:01:30

标签: python list conditional-statements

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

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

给定name_list = ['Aleck', 'Bob'],我想在name_list中删除class_list中具有相同名称的元素,而我还需要知道名称(例如Bob)是否不在class_list中(例如打印出来)那个鲍勃不在列表中)

对于上面的例子,结果应该是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)

2 个答案:

答案 0 :(得分:4)

列表理解是你的朋友。

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

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

答案 1 :(得分:4)

你没有类,你有类实例。 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)