簡體   English   中英

刪除列表列表中的重復項

[英]remove duplicates in lists of lists of list

我有一個類型列表:

biglist = [[
    [77.56913757324219, 12.975883483886719], [77.5671615600586, 12.976168632507324], 
    [77.5680160522461, 12.980805397033691], [77.56996154785156, 12.980448722839355], 
    [77.56913757324219, 12.975883483886719]
]]

為了刪除重復項,我在python中編寫了以下代碼:

templist = set(map(tuple,biglist[0]))
newlist = map(list,templist)

盡管這刪除了dup元素,但我松了list列表中list的初始結構。 有人可以幫忙刪除重復項嗎?

謝謝

編輯:關於我正在嘗試做的一點背景:
您看到的數字是地理信息系統中使用的多邊形形狀的一部分。 我正在嘗試在MongoDB中存儲和索引它。 但是,建立索引時出現錯誤,一種可能的解決方案是刪除重復的值,然后嘗試再次建立索引。 基本上,您看到的列表是GeoJSON格式的,我需要保留該順序以插入到mongoDB中。

預期的輸出將是:

[[
        [77.56913757324219, 12.975883483886719], [77.5671615600586, 12.976168632507324], 
        [77.5680160522461, 12.980805397033691], [77.56996154785156, 12.980448722839355]
    ]]

對,這應該得到您想要的:

>>> newlist = [[]]
>>> for i in range(len(biglist[0])):
...     if not test[0][i] in newlist[0]:
...         newlist[0].append(test[0][i])
...
>>> newlist
[[[77.56913757324219, 12.975883483886719], [77.5671615600586, 12.976168632507324], [77.5680160522461, 12.980805397033691], [77.56996154785156, 12.980448722839355]]]

但是,您確實應該考慮以下幾點:

  • 正如我在評論中指出的那樣,比較浮點數會給您帶來很多麻煩。 小於1x10 ^ 8(或小於1x10 ^ 8)的值將導致您的比較失敗,而這種差異可能是由於缺乏精度(浮點錯誤)而引起的。 您應該始終將浮點數與公差進行比較,以避免出現這種情況。

  • 我不確定為什么會有雙重嵌套的列表,但是從這里給出的結果來看,這似乎很愚蠢,並使所有事情變得更加復雜

另外,您的解決方案無法正常工作,因為您將列表轉換為集合。 由於集合本質上是無序的,因此當您轉換為列表時,順序會更改。 將來,如果您關心元素的順序(聽起來就像是在進行編輯),則應避免使用集(或字典),因為這個原因。

此解決方案不是最佳解決方案,但可以幫助您:

#!/usr/bin/python

biglist = [[
    [77.56913757324219, 12.975883483886719], [77.5671615600586, 12.976168632507324],
    [77.5680160522461, 12.980805397033691], [77.56996154785156, 12.980448722839355],
    [77.56913757324219, 12.975883483886719]
]]

blist = map(tuple, biglist[0])

seen = set()
result = list()
for tup in blist:
    if tup not in seen:
        seen.add(tup)
        result.append(tup)

print map(list, result)

或者您可以嘗試使用訂單字典:

>>> import collections
>>> a = collections.OrderedDict()
>>> for big in biglist[0]:
...     a.setdefault(tuple(big), None)
...
>>> a.keys()
[(77.56913757324219, 12.975883483886719), (77.5671615600586, 12.976168632507324),     (77.5680160522461, 12.980805397033691), (77.56996154785156, 12.980448722839355)]
>>>

如果要堅持使用原始解決方案,只需使用OrderedSet而不是set

暫無
暫無

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

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