元组删除列表

时间:2015-03-07 06:28:10

标签: python list tuples

我有一个像

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

我如何获得

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

如果元组的左侧相同,则仅保留最大的元组右侧 如果某些元组具有相同的左值,那么具有最大正确值的元组应该在列表中,其他没有相同左(第一)值的元组应该保持原样

2 个答案:

答案 0 :(得分:3)

通过对项目进行排序并删除重复项,可以轻松实现您想象的内容。请注意,在处理对元组时,删除重复项在此处指示删除具有相同第一个元素的对升序中的元素排序会以任何方式对元素进行排序,以便如果两对具有相同的第一项,则具有较大第二项的对将跟随另一对< / strong>即可。

注意,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)]

答案 1 :(得分:2)

您不需要收藏品或任何花哨的图书馆。我们假设我们有一个像这样的元组列表(这比你自己的例子有点麻烦):

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)],我认为这是正确的。