元组删除列表

List of tuples deletion

我有一个像

这样的元组列表
[(1,1),(2,1),(2,2),(5,2),(5,6)]

如何获得

[(1,1),(2,2),(5,6)]

如果元组左边相同,只保留右边最大的元组 如果一些元组具有相同的左值,那么具有最大右值的元组应该在列表中,其他没有相同左(第一个)值与之竞争的元组应该保持原样

通过对项目进行排序并删除重复项,可以轻松实现您的设想。请注意,当您处理元组对时,删除重复项 表示删除具有相同第一个元素的对排序 升序中的元素无论如何都会对元素进行排序,使得如果两对具有相同的第一项,则具有较大的第二个项目将跟随另一个

注意,python dict/set 不遵循任何明确的顺序,因此 使用有序字典很重要

>>> from collections import OrderedDict
>>> lst = [(1,1),(2,1),(2,2),(5,2),(5,6)]
>>> OrderedDict(sorted(lst)).items()
[(1, 1), (2, 2), (5, 6)]
>>> lst = [(2, 1), (2, 2), (2, 3), (3, 1), (5, 1)]
>>> OrderedDict(sorted(lst)).items()
[(2, 3), (3, 1), (5, 1)]

另一种方法虽然有点复杂,但使用 groupby。哪一个更好是主观的,需要进行性能比较。

>>> from itertools import groupby
>>> from operator import itemgetter
>>> lst =  [(2, 1), (2, 2), (2, 3), (3, 1), (5, 1)]
>>> [max(v) for k, v in groupby(sorted(lst), key = itemgetter(0))]
[(2, 3), (3, 1), (5, 1)]
>>> lst = [(1,1),(2,1),(2,2),(5,2),(5,6)]
>>> [max(v) for k, v in groupby(sorted(lst), key = itemgetter(0))]
[(1, 1), (2, 2), (5, 6)]

您不需要集合或任何花哨的图书馆。假设我们有一个这样的元组列表(比你自己的例子有点混乱):

listt = [(8, 1),(1, 1),(2, 1),(2, 2),(5, 2),(5, 6)]

为方便起见,我宁愿先根据元组的第一个元素对列表进行排序:

listt = sorted(listt,key=lambda x: x[0])
# Now we have [(1, 1), (2, 1), (2, 2), (5, 2), (5, 6), (8, 1)]

现在在每一组首元素相同的元组中,我们只需要取出最后一个元素即可。由于列表的排序方式,我们最终会得到具有最大第二个元素的元组:

new_listt = []
elem_0 = listt[0][0]

for i in range(len(listt)-1):
    if listt[i+1][0] != elem_0:
        new_listt.append(listt[i])
        elem_0 = listt[i+1][0]

#We have to also account for the last element     
new_listt.append(listt[i+1])

我们可以检查它是否有效:

print(listt)
print("====")
print(new_listt)  

在我的示例中,它返回 [(1, 1), (2, 2), (5, 6), (8, 4)],而 listt = [(2, 1), (2, 2), (2, 3), (3, 1), (5, 1)] 返回 [(2, 3), (3, 1), (5, 1)],我认为这是正确的。