python如何找出三维列表中的重复元素

时间:2015-10-07 15:03:23

标签: python list

我有一个如下列表:

list2=
[[((2, 2), (5, 5)), (4.0, 4.0)], [((4, 2), (4, 8)), (4.0, 4.0)], 
[((5, 6), (3, 8)), (4.0, 7.0)], [((4, 2), (4, 8)), (4.0, 7.0)], 
[((5, 6), (3, 8)), (4.0, 7.0)], [((1, 4), (5, 8)), (4.0, 7.0)], 
[((4, 2), (4, 8)), (4.0, 7.0)], [((1, 4), (5, 8)), (4.0, 7.0)]]

我要做的是找出list[i][0]中的重复元素,例如

[((4, 2), (4, 8)), (4.0, 4.0)] ,[((4, 2), (4, 8)), (4.0, 7.0)]

list2[1][0]list2[6][0]相同),然后将后者中的(4.0,7.0)添加到前者,然后从list2中删除后者

我尝试使用循环来实现,但它不起作用。 我的代码:

list3=list2
i=range(0,len(list2))
j=range(0,len(list2))
  for i in list2:
      for j in list3:
        if list2[i][0]==list3[j][0] and list2[i][1]!=list3[j][1]:
        list2[i].append(list3[j][1])
        list2.pop(j)

任何建议都会有所帮助!谢谢

2 个答案:

答案 0 :(得分:0)

我假设重复项具有相同的第一项但不同的最后项。我还假设结果列表的顺序并不重要(因此排序更快的运行时间):

def reduceDups(lst):
  lst = sorted(lst)
  i = 0
  while(i < len(lst)):
    if(i < len(lst) - 1):
      # Get reference elements
      (refFirst, refLast) = (lst[i][:-1], lst[i][-1])

      # Get first, last elements of possible duplicate
      (dupFirst, dupLast) = (lst[i + 1][:-1], lst[i + 1][-1])

      if(refFirst == dupFirst):
        # Next element is identical (by our comparison). Get rid of it
        lst.pop(i + 1)
        lst[i].append(dupLast)
      else:
        i += 1
    else:
      i += 1

  return lst

对于输入列表,这给出:

[[((1, 4), (5, 8)), (4.0, 7.0), (4.0, 7.0)],
 [((2, 2), (5, 5)), (4.0, 4.0)],
 [((4, 2), (4, 8)), (4.0, 4.0), (4.0, 7.0)],
 [((4, 2), (4, 8)), (4.0, 7.0)],
 [((5, 6), (3, 8)), (4.0, 7.0), (4.0, 7.0)]]

答案 1 :(得分:0)

你可以使用元组作为字典的键,所以它真的很容易(如果我理解正确的问题,那就是)

d={}
for x in list2:
    d.setdefault( x[0], [] ).append(x)
for k,v in d.items():
    if len(v) > 1:
       # v is a list of members of list2 sharing a common v[0]
       print(v)

你的list2我得到了这个输出

[[((1, 4), (5, 8)), (4.0, 7.0)], [((1, 4), (5, 8)), (4.0, 7.0)]]
[[((4, 2), (4, 8)), (4.0, 4.0)], [((4, 2), (4, 8)), (4.0, 7.0)]]