Python:根据对象属性删除对象表单列表

时间:2014-01-03 16:07:58

标签: python django

我有一个python对象列表,我想根据时间值删除列表中的重复项。 例如:

class MyClass(object):

    identifier = models.CharField(max_length=128)
    label = models.CharField(max_length=128)
    stat_time = models.DateTimeField(auto_now_add=True)
    def __unicode__(self):
        return str(self.label)

我的列表可能有几个具有相同标签但不同的stat_times的MyClass实例。 我想修剪列表,只有一个带有最新stat_time的标签实例。

>>> my_list
[MyClass: xxx, MyClass: yyy, MyClass: yyy, MyClass: zzz]

我想结束:

>>> my_list
[MyClass: xxx, MyClass: yyy, MyClass: zzz]

这里my_list应该只包含一个MyClass实例,其中'yyy'标签带有最新的stat_time。

我希望我已经说清楚了。 任何建议都非常赞赏。

2 个答案:

答案 0 :(得分:1)

您可以采用的一种方法是创建dictlabel个实例的MyClass映射值。您可以将列表中的每个元素添加到此dict,但只保留所需的值。

aDict = dict()
for element in myList:
    s = element.label
    if s not in aDict: # the key is not used yet
        aDict[s] = element
    else:
        aDict[s] = max(aDict[s], element, key = lambda x: x.stat_time)
myList = list(aDict.items()) # iteritems() in Python 2

传递给lambda的{​​{1}}表达式告诉Python在计算最大值时要比较哪个值。

答案 1 :(得分:0)

我不确定您是否应该根据__unicode__()过滤您的对象,但这是我将如何做到的。

unique_objs = []

for o in my_list:
    if (o.__unicode__(), o.stat_time) in unique_objs:
        continue
    new_list.append(o)
    unique_objs.append(tuple(o.__unicode__(), o.stat_time))