Python,从元组列表中删除重复项

4 投票
5 回答
9079 浏览
提问于 2025-04-16 20:30

我有以下这个列表:

[('mail', 167, datetime.datetime(2010, 9, 29)) , 
 ('name', 1317, datetime.datetime(2011, 12, 12)), 
 ('mail', 1045, datetime.datetime(2010, 8, 13)), 
 ('name', 3, datetime.datetime(2011, 11, 3))]

我想从这个列表中删除那些元组中第一个元素相同,但日期不是最新的项目。换句话说,我需要得到这个:

[('mail', 167, datetime.datetime(2010, 9, 29)) , 
 ('name', 1317, datetime.datetime(2011, 12, 12))]

5 个回答

0

这段代码是用来做某些操作的,但具体的功能需要根据上下文来理解。代码块通常包含了一些指令或者功能,帮助程序完成特定的任务。

如果你看到类似于

d = {}

for item in list:
    if (item[0], item[1]) not in d:
        d[(item[0], item[1])] = item[2]
    else:
        if item[2] > d[(item[0], item[1])]:
            d[(item[0], item[1])] = item[2]

item = [(x[0], x[1], d[x] for x in d.keys()]
这样的内容,通常它是一个占位符,表示这里应该有一段代码。你可以把它想象成一个空白的框,等着你去填充具体的内容。

2

下面的方法使用字典来覆盖具有相同键的条目。因为列表是按日期排序的,所以较旧的条目会被较新的条目覆盖。

temp = {}
for v in sorted(L, key=lambda L: L[2]): # where L is your list
    temp[v[0]] = v
result = temp.values()

或者,有一种更简洁的方法(但可读性差得多):

result = dict((v[0],v) for v in sorted(L, key=lambda L: L[2])).values()

更新

如果列表已经(或者大部分)按日期排序,那么这种方法会比较快。如果没有排序,尤其是当列表很大的时候,这可能不是最佳选择。

对于未排序的列表,首先按键排序,然后按日期排序,可能会提高一些性能。也就是说,可以用 sorted(L, key=lambda L: (L[0],L[2])) 来实现。

或者,更好的选择是参考 Space_C0wb0y 的回答

16

你可以用一个字典来存储到目前为止某个键对应的最高值:

temp = {}
for key, number, date in input_list:
    if key not in temp: # we see this key for the first time
        temp[key] = (key, number, date)
    else:
        if temp[key][2] < date: # the new date is larger than the old one
            temp[key] = (key, number, date)
result = temp.values()

撰写回答