python – 根据内部列表元素的比较从列表列表中删除重复项

前端之家收集整理的这篇文章主要介绍了python – 根据内部列表元素的比较从列表列表中删除重复项前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个很大的列表列表,需要根据特定条件删除重复的元素:

>唯一性由列表的第一个元素决定.
>通过比较重复列表的第二个元素的值来确定删除重复项,即使列表保持最低的第二个元素.

[[1,4,5],[1,3,4],2,3]]

以上所有列表都被认为是重复的,因为它们的第一个元素是相同的.需要保留第三个列表,因为它的第二个元素是最小的.请注意,实际的列表列表有超过400万个元素,是双重排序的,需要保留排序.

该列表首先根据内部列表的第二个元素以反向(降序)顺序排序,然后是基于第一个元素的正常(升序)顺序:

sorted(sorted(the_list,key=itemgetter(1),reverse=True),key=itemgetter(0))

实际排序中三个重复列表的示例:

[...
[33554432,50331647,1695008306],[33554432,34603007,1904606324],33554687,2208089473],...]

目标是准备二等分搜索列表.有人能让我了解如何使用Python实现这一目标吗?

最佳答案
您可以使用dict对元素进行分组,始终使用较小的第二个元素保留子列表:

l = [[1,3],[2,5,6],1,3]]
d = {}
for sub in l:
    k = sub[0]
    if k not in d or sub[1] < d[k][1]:
        d[k] = sub

您也可以传递两个键进行排序,您不需要调用两次排序:

In [3]:  l = [[1,6,2],5]]
In [4]: sorted(l,key=lambda x: (-x[1],x[0]))
Out[4]: [[1,6]]

如果你想维护dict中的顺序,则需要保留订单:

from collections import OrderedDict

l = [[1,3]]
d = OrderedDict()
for sub in l:
    k = sub[0]
    if k not in d or sub[1] < d[k][1]:
        d[sub[0]] = sub

但是不确定这样做是否合适,因为您将丢失任何订单后对数据进行排序.

您可能会发现非常有用的是sortedcontainers.sorteddict

A SortedDict provides the same methods as a dict. Additionally,a SortedDict efficiently maintains its keys in sorted order. Consequently,the keys method will return the keys in sorted order,the popitem method will remove the item with the highest key,etc.

An optional key argument defines a callable that,like the key argument to Python’s sorted function,extracts a comparison key from each dict key. If no function is specified,the default compares the dict keys directly. The key argument must be provided as a positional argument and must come before all other arguments.

from sortedcontainers import SortedDict

l = [[1,3]]
d = SortedDict()
for sub in l:
    k = sub[0]
    if k not in d or sub[1] < d[k][1]:
        d[k] = sub


print(list(d.values()))

它有你想要的所有方法bisect,bisect_left等.

猜你在找的Python相关文章