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