从列表中筛选出重复的属性

时间:2015-01-20 09:58:08

标签: python list filter attributes

我想通过其中一个属性值过滤列表,结果是我得到一个列表,其中该属性值是唯一的。

我目前使用函数

执行此操作
def filter_function(self):
    filtered = []
    for data in self.list_of_data:
        exist = False
        for f in filtered:
            if data.val1 == f.val1:
                exist = True

        if not exist:
            filtered.append(data)
    return filtered

其中self.list_of_data是我要过滤掉的列表。 是否可以使用lambda?

使用map或filter函数执行此操作

这里数据是一个对象,例如

class Data(object):
    def __init__(self)
        self.val1
        self.val2
        ...

换句话说,是否可以使用过滤函数来过滤掉'val1'所在的数据对象。等于5,将'thevals'留作'wildcard'?

例如:

  filter( lamda x: f(x), [ { 'val1': 5, 'val2': 2}, { 'val1': 5, 'val2': 3}, { 'val1': 2, 'val2': 2}, { 'val1': 2, 'val2': 3}] ) 

应该有五个

  [ { 'val1': 5, 'val2': 2}, { 'val1': 5, 'val2': 3}] 

其中f(x)过滤掉其val1不是5的所有对象?

2 个答案:

答案 0 :(得分:1)

Sets in Python非常适合过滤重复项。

如果您从列表开始,只需转换为集合:

>>> lst = [1,1,2,3,4,5]
>>> set(lst)
{1, 2, 3, 4, 5}
>>> my_set = set(lst)
>>> revised_lst = list(my_set)
>>> revised_lst
[1, 2, 3, 4, 5]

这摆脱了重复。然后,如果需要,转换回列表:

答案 1 :(得分:0)

我假设你有类似的东西:

class test(object):
    def __init__(self):
        self.a = 1
        self.b = 2

提取你可以做的值:

>>> test().__dict__

输出:

{'a': 1, 'b': 2}

从此处您可以像我在下面显示的那样申请set

您可以使用set

list = [1,2,3,3,4,5,5,5,6,7]

print set(list)

输出:

set([1, 2, 3, 4, 5, 6, 7])

你也可以用另一个过滤你的名单:

list = [1,2,3,4,5,6]
filter = [2,5,7]

print set(list) & set(filter)

输出:

set([2,5])