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

发布于 2024-11-17 16:27:02 字数 417 浏览 1 评论 0原文

我有以下列表:

[('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))]

I have the following list:

[('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))]

And I want to remove items from the list with coinciding first item in a tuple where date is not the latest. In other words I need to get this:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

粉红×色少女 2024-11-24 16:27:02

您可以使用字典来存储迄今为止为给定键找到的最高值:

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()

You can use a dictionary to store the highest value found for a given key so far:

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()
缪败 2024-11-24 16:27:02

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

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 的答案

The following approach uses a dictionary to overwrite entries with the same key. Since the list is sorted by the date, older entries get overwritten by newer ones.

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

Or, for something a lot more compact (but much less readable):

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

Update

This method would be reasonably quick if the list is already (or mostly) sorted by date. If it isn't, and especially if it is a large list, then this may not be the best approach.

For unsorted lists, you will likely get a some performance improvement by sorting by the key first, then the date. i.e. sorted(L, key=lambda L: (L[0],L[2])).

Or, better yet, go for Space_C0wb0y's answer.

っ〆星空下的拥抱 2024-11-24 16:27:02
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()]
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()]
海之角 2024-11-24 16:27:02

您可以通过对列表进行排序并通过 d[2] 获取最高值来实现:

    In [26]: d
    Out[26]: 
    [('mail', 167, datetime.datetime(2010, 9, 29, 0, 0)),
     ('name', 1317, datetime.datetime(2011, 12, 12, 0, 0)),
     ('mail', 1045, datetime.datetime(2010, 8, 13, 0, 0)),
     ('name', 3, datetime.datetime(2011, 11, 3, 0, 0))]

    In [27]: d.sort(key = lambda i: i[2], reverse=True)

    In [28]: d
    Out[28]: 
    [('name', 1317, datetime.datetime(2011, 12, 12, 0, 0)),
     ('name', 3, datetime.datetime(2011, 11, 3, 0, 0)),
     ('mail', 167, datetime.datetime(2010, 9, 29, 0, 0)),
     ('mail', 1045, datetime.datetime(2010, 8, 13, 0, 0))]

    In [29]: [i for pos, i in enumerate(d) if i[0] in [j[0] for j in d[pos+1:]]]
    Out[29]: 
    [('name', 1317, datetime.datetime(2011, 12, 12, 0, 0)),
     ('mail', 167, datetime.datetime(2010, 9, 29, 0, 0))]

You can do it via sorting the list and getting the highest values by d[2]:

    In [26]: d
    Out[26]: 
    [('mail', 167, datetime.datetime(2010, 9, 29, 0, 0)),
     ('name', 1317, datetime.datetime(2011, 12, 12, 0, 0)),
     ('mail', 1045, datetime.datetime(2010, 8, 13, 0, 0)),
     ('name', 3, datetime.datetime(2011, 11, 3, 0, 0))]

    In [27]: d.sort(key = lambda i: i[2], reverse=True)

    In [28]: d
    Out[28]: 
    [('name', 1317, datetime.datetime(2011, 12, 12, 0, 0)),
     ('name', 3, datetime.datetime(2011, 11, 3, 0, 0)),
     ('mail', 167, datetime.datetime(2010, 9, 29, 0, 0)),
     ('mail', 1045, datetime.datetime(2010, 8, 13, 0, 0))]

    In [29]: [i for pos, i in enumerate(d) if i[0] in [j[0] for j in d[pos+1:]]]
    Out[29]: 
    [('name', 1317, datetime.datetime(2011, 12, 12, 0, 0)),
     ('mail', 167, datetime.datetime(2010, 9, 29, 0, 0))]
海之角 2024-11-24 16:27:02

干得好。

#!/usr/bin/python2

from pprint import pprint
import datetime

ol = [('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))]

d = {}

for t in sorted(ol, key=lambda t: (t[0], t[2])):
    d[t[0]] = t
out = d.values()

pprint(out)

使用第一个和第三个元组元素作为键对列表进行排序,然后使用哈希表删除重复项。

Here you go.

#!/usr/bin/python2

from pprint import pprint
import datetime

ol = [('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))]

d = {}

for t in sorted(ol, key=lambda t: (t[0], t[2])):
    d[t[0]] = t
out = d.values()

pprint(out)

That sorts the list using the first and third tuple elements as keys, then removes duplicates by using a hash table.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文