我需要一种有效的算法来将具有重复项的列表合并为1个列表。列表中有相同的Exat项目,但顺序不同。而且它们都在一个大列表内。 例如:[[1,2,3],[3,2,1],[2,1,3],[4,5],[5,4],[6]] 输出应为:[[1,2,3],[4,5],[6]]
我有这段代码,但是当我遍历列表并删除项目时,索引超出范围:
biglist = [ [1,2,3],[3,2,1],[2,1,3],[4,5],[5,4],[6] ]
for i in range(len(biglist)):
temp = set(biglist[i])
for j in range(i,len(biglist)-1):
temp2 = set(biglist[j])
if(temp == temp2):
del biglist[j]
答案 0 :(得分:1)
一种解决方案是将biglist
中的列表进行排序然后转换为元组,
set()
将允许删除重复项。
def remove_dups(a):
return list(map(list, set(map(tuple, map(sorted, a)))))
print (remove_dups(biglist))
# [[4, 5], [6], [1, 2, 3]]
答案 1 :(得分:1)
解释在代码注释中。
尝试一下:
big_list = [ [1,2,3],[3,2,1],[2,1,3],[4,5],[5,4],[6] ]
temp_list = []
#for every small list in the big list
for small_list in big_list:
#sort small list
small_list.sort()
#if the small list is not in the temp list, add it
if small_list not in temp_list:
temp_list.append(small_list)
#sort the temp list
temp_list.sort()
#print the temp list
print (temp_list)
输出:
[[1, 2, 3], [4, 5], [6]]
答案 2 :(得分:0)
我修改了自己的代码,而不是编写新的代码。希望这可以帮助您了解问题所在并解决。
biglist = [ [1,2,3],[3,2,1],[2,1,3],[4,5],[5,4],[6] ]
#list to keep track of the indexes which should be deleted
indexes=[]
for i in range(len(biglist)):
temp = set(biglist[i])
for j in range(i+1,len(biglist)):
temp2 = set(biglist[j])
if(temp == temp2):
indexes.append(j)
#to remove the duplicates
indexes=list(set(indexes))
for i in range (len(indexes)):
#to delete in reverse order so that indexes won't be affected
del biglist[indexes[len(indexes)-i-1]]
print biglist
答案 3 :(得分:0)
尝试一下:
import itertools
biglist = [ [1,2,3],[3,2,1],[2,1,3],[4,5],[5,4],[6] ]
sort_l = [sorted(i) for i in biglist]
list(k for k,_ in itertools.groupby(sort_l))
答案 4 :(得分:0)
您可以将列表转换为已排序的tuples
,然后在元组列表上使用set
并将其转换回列表。
lst = [i for i in set(tuple(sorted(i)) for i in biglist)]
res = sorted([*i] for i in lst)
print(res)
# [[1, 2, 3], [4, 5], [6]]