识别列表列表中的重复列表?

时间:2017-05-30 14:54:31

标签: python list

如何在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] ]

非常感谢任何帮助。 我似乎无法弄清楚这一点。

4 个答案:

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