我有一个像
这样的元组列表[(1,1),(2,1),(2,2),(5,2),(5,6)]
我如何获得
[(1,1),(2,2),(5,6)]
如果元组的左侧相同,则仅保留最大的元组右侧 如果某些元组具有相同的左值,那么具有最大正确值的元组应该在列表中,其他没有相同左(第一)值的元组应该保持原样
答案 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)]
,我认为这是正确的。