我应该如何获得列表中的重复子列表?

时间:2015-12-07 16:24:30

标签: python list duplicates sublist

我正在尝试创建允许我获取列表中唯一子列表的列表的函数。这些功能适用于某些列表列表而不适用于其他列表,我不确定原因。

获取重复子列表的索引然后构建它们列表是一种有效,可靠的方法是什么?

以下最小工作示例说明了该功能。找到列表public String getReportName() { return _reportName; } public void setReportName(String reportName) { _reportName = reportName; } 的重复项,但列表a找不到。

b

4 个答案:

答案 0 :(得分:1)

您可以使用Counter dict将子列表映射到元组并获取计数,仅保留计数为>的子列表。 1:

from collections import Counter
a = [[1, 2], [1, 2], [2, 2], [3, 2], [4, 2], [5, 2], [5, 2]]


cn = Counter(map(tuple,a))

print([sub for sub in a if cn[tuple(sub)] > 1])

适用于混合类型并获得独特的回报:

from collections import Counter    

a = [[1, 2], [1, 2], [2, 2], [3, 2], [4, 2], [5, 2], [5, 2], "foo", 123, 123]

def counts(x):
    for ele in x:
        if isinstance(ele, Hashable):
            yield ele
        else:
            yield tuple(ele)


def unique_dupes(x):
    cnts = Counter(counts(x))
    for ele in x:
        t = ele
        if not isinstance(ele, Hashable):
            t = tuple(ele)
        if cnts[t] > 1:
            yield ele
            del cnts[t]

print(list(unique_dupes(a)))

输出:

 [[1, 2], [5, 2], 123]

答案 1 :(得分:0)

问题必须来自以下几点:

if isinstance(element, list):
    element = tuple(element)
if element not in seen:
    seen.add(element)

那么如果你已经在seen[10,15],然后你想检查看到的[15,10],它会返回FALSE

对此进行修复,当您认为[x,y][y,x]相同时,就是按照这种方式对您检查的每个元素进行排序:

if isinstance(element, list):
    element = tuple(sorted(element))
if element not in seen:
    seen.add(element)

答案 2 :(得分:0)

列表理解很简单

list_a = [[1, 2], [1, 2], [2, 2], [3, 2], [4, 2], [5, 2], [5, 2]]

    unique_list=[]
    duplicate_list=[]
    sorted_list=[sorted(item) for item in list_a]

    final_list=[unique_list.append(item) if item not in unique_list else duplicate_list.append(item) for item in sorted_list]
    print(unique_list)
    print(duplicate_list)

答案 3 :(得分:-1)

Python列表具有一个漂亮的内置函数,称为count。使用此功能,您可以:

a = [[1, 2], [1, 2], [2, 2], [3, 2], [4, 2], [5, 2], [5, 2]]
dups = list()

for e in a:
    if a.count(e) > 1:
        dups.append(e)

这会为您提供一个名为dups的列表,其中包含[[1,2],[1,2],[5,2],[5,2]]