如何在python中将列表列表与自身进行比较,以便:
示例:
list = [ [1, 3, 5, 6], [7, 8], [10, 12], [9], [3, 1, 5, 6], [12, 10] ]
clean_list = [ [1, 3, 5, 6], [7, 8], [10, 12], [9] ]
非常感谢任何帮助。 我似乎无法弄清楚这一点。
答案 0 :(得分:2)
我会重建" clean_list"在列表理解中,检查子列表的排序版本是否已经不在前面的元素中
the_list = [ [1, 3, 5, 6], [7, 8], [10, 12], [9], [3, 1, 5, 6], [12, 10] ]
clean_list = [l for i,l in enumerate(the_list) if all(sorted(l)!=sorted(the_list[j]) for j in range(0,i))]
print(clean_list)
当然,为每次迭代排序项目非常耗时,因此您可以准备一个已排序的子列表列表:
the_sorted_list = [sorted(l) for l in the_list]
并使用它:
clean_list = [the_list[i] for i,l in enumerate(the_sorted_list) if all(l!=the_sorted_list[j] for j in range(0,i))]
结果(在两种情况下):
[[1, 3, 5, 6], [7, 8], [10, 12], [9]]
正如许多人所建议的那样,在for
中存储已经看过的项目的简单set
循环(没有列表理解)可能更适合查找重复项。如果输入列表非常大,以避免O(n)
查找all
,则可能需要该备用解决方案。
实施的一个例子可能是:
test_set = set()
clean_list = []
for l in the_list:
sl = sorted(l)
tsl = tuple(sl)
if not tsl in test_set:
test_set.add(tsl) # note it down to avoid inserting it next time
clean_list.append(sl)
答案 1 :(得分:0)
创建一个集合。然后对列表中的每个列表进行排序,转换为元组,然后插入到集合中。
setOfLists = set()
for list in listOfLists:
list.sort()
setOfLists.add(tuple(list))
print setOfLists
您可以再次将集合中的元组重新转换为列表。
答案 2 :(得分:0)
简单的for循环可行,但如果您的数据集很小,例如1k或更少,您可以使用:
b = []
[b.append(i) for i in a if len([j for j in b if set(j) == set(i)])==0 ]
print b
答案 3 :(得分:0)
所以我接受了这个。
我定义了一个对每个子列表进行排序并附加到临时列表的函数。然后我检查temp_my_list中的子列表是否是'不是'在temp_clean_list中,如果没有,则追加到新列表。这适用于任何2套清单。我添加了一些额外的列表来显示除了空字符串之外的某种结果。
my_list = [[1, 3, 5, 6], [7, 8], [10, 12], [9], [3, 1, 5, 6], [12, 10],[16]]
clean_list = [ [1, 3, 5, 6], [7, 8], [10, 12], [9],[18]]
new_list = []
def getNewList():
temp_my_list = []
temp_clean_list = []
for sublist in my_list:
sublist.sort()
temp_my_list.append(msublist)
for sublist in clean_list:
sublist.sort()
temp_clean_list.append(sublist)
for sublist in temp_my_list:
if sublist not in temp_clean_list:
new_list.append(sublist)
getNewList()
print (new_list)
Resulit:
[[16]]