[英]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.