删除列表列表中的重复项

时间:2014-04-07 12:12:33

标签: python

我有一个类型列表:

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]
    ]]

3 个答案:

答案 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