我有一个如下列表:
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)
任何建议都会有所帮助!谢谢
答案 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)]]