我有一个类型列表:
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元素,但我会松开列表列表中列表的初始结构。有人可以帮助删除重复项吗?
谢谢
编辑:
关于我想做什么的一点背景:
您看到的数字是地理信息系统中使用的多边形形状的一部分。我试图在MongoDB中存储和索引它。但是,我在索引时遇到错误,其中一个可能的解决方案是删除重复值并尝试再次索引它。基本上,您看到的列表是GeoJSON格式,我需要保留插入mongoDB的顺序。
预期输出为:
[[
[77.56913757324219, 12.975883483886719], [77.5671615600586, 12.976168632507324],
[77.5680160522461, 12.980805397033691], [77.56996154785156, 12.980448722839355]
]]
答案 0 :(得分:1)
是的,这应该得到你想要的东西:
>>> 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(或更小)的值将导致比较失败,并且这种差异可能是由于缺乏精度(浮点错误)引起的。您应该始终将浮点数与容差进行比较以避免这种情况。
我不确定为什么你有一个双重嵌套列表,但是从你在这里给出的内容来看,它看起来很傻,并且使一切变得更加复杂
此外,您的解决方案无效,因为您已将列表转换为集合。由于集合本质上是无序的,因此当您重新转换为列表时,订单会更改。将来,如果你关心你的元素的顺序(形成你的编辑,听起来像你这样做),为此避免使用集合(或字典)。
答案 1 :(得分:0)
这个解决方案并不是最好的,但它可能对您有所帮助:
#!/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)
或者你可以尝试使用order dict:
>>> 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)]
>>>
答案 2 :(得分:0)
如果您想坚持使用原始解决方案,只需使用OrderedSet代替set
。