我有一个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。
我希望我已经说清楚了。 任何建议都非常赞赏。
答案 0 :(得分:1)
您可以采用的一种方法是创建dict
到label
个实例的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))