繁体   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