簡體   English   中英

基於內部列表的元素的比較從列表列表中刪除重復項

[英]Removing duplicates from a list of lists based on a comparison of an element of the inner lists

我有一個很大的列表列表,需要根據特定條件刪除重復的元素:

  1. 唯一性由列表的第一個元素決定。
  2. 通過比較重復列表的第二個元素的值來確定刪除重復項,即保持列表具有最低的第二個元素。

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

以上所有列表都被認為是重復的,因為它們的第一個元素是相同的。 需要保留第三個列表,因為它的第二個元素是最小的。 請注意,實際的列表列表有超過400萬個元素,是雙重排序的,需要保留排序。

該列表首先根據內部列表的第二個元素以反向(降序)順序排序,然后是基於第一個元素的正常(升序)順序:

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

實際排序中三個重復列表的示例:

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

目標是准備二等分搜索列表。 有人能讓我了解如何使用Python實現這一目標嗎?

您可以使用dict對元素進行分組,始終使用較小的第二個元素保留子列表:

l = [[1, 2, 3], [1, 3, 4], [1, 4, 5], [2, 4, 3], [2, 5, 6], [2, 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,4,6,2],[2,2,4,6],[1,2,4,5]]
In [4]: sorted(l,key=lambda x: (-x[1],x[0]))
Out[4]: [[1, 4, 6, 2], [1, 2, 4, 5], [2, 2, 4, 6]]

如果你想維護dict中的順序,則需要保留訂單。

from collections import OrderedDict

l = [[1, 2, 3], [1, 3, 4], [1, 4, 5], [2, 4, 3], [2, 5, 6], [2, 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

SortedDict提供與dict相同的方法。 此外,SortedDict有效地按排序順序維護其鍵。 因此,keys方法將按排序順序返回鍵,popitem方法將刪除具有最高鍵的項目等。

可選的key參數定義了一個可調用的函數,它與Python的排序函數的鍵參數一樣,從每個dict鍵中提取一個比較鍵。 如果未指定任何功能,則默認直接比較dict鍵。 必須將關鍵參數作為位置參數提供,並且必須在所有其他參數之前。

from sortedcontainers import SortedDict

l = [[1, 2, 3], [1, 3, 4], [1, 4, 5], [2, 4, 3], [2, 5, 6], [2, 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()))

它有你想要的所有方法bisectbisect_left等。

如果我得到正確的解決方案,解決方案可能是這樣的:

mylist = [[1, 2, 3], [1, 3, 4], [1, 4, 5], [7, 3, 6], [7, 1, 8]]

ordering = []
newdata = {}

for a, b, c in mylist:
    if a in newdata:
        if b < newdata[a][1]:
            newdata[a] = [a, b, c]
    else:
        newdata[a] = [a, b, c]
        ordering.append(a)

newlist = [newdata[v] for v in ordering]

因此,在newlist我們將獲得降低的列表[[1, 2, 3], [7, 1, 8]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM