元组删除列表
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)]
,我认为这是正确的。
我有一个像
这样的元组列表[(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)]
,我认为这是正确的。