Python 如何获取列表中重复子列表的列表?

Python 如何获取列表中重复子列表的列表?,python,list,duplicates,sublist,Python,List,Duplicates,Sublist,我正在尝试创建一些函数,这些函数允许我获取列表中唯一子列表的列表。这些函数适用于某些列表,而不适用于其他列表,我不知道为什么 获取重复子列表的索引,然后构建它们的列表,哪种方法是有效的、健壮的 下面的示例演示了该功能。在列表a中找到了重复项,但在列表b中发现的重复项不正确 def indices_of_list_element_duplicates(x): seen = set() for index, element in enumerate(x): if is

我正在尝试创建一些函数,这些函数允许我获取列表中唯一子列表的列表。这些函数适用于某些列表,而不适用于其他列表,我不知道为什么

获取重复子列表的索引,然后构建它们的列表,哪种方法是有效的、健壮的

下面的示例演示了该功能。在列表
a
中找到了重复项,但在列表
b
中发现的重复项不正确

def indices_of_list_element_duplicates(x):
    seen = set()
    for index, element in enumerate(x):
        if isinstance(element, list):
            element = tuple(element)
        if element not in seen:
            seen.add(element)
        else:
            yield index

def list_element_duplicates(x):
    indices = list(indices_of_list_element_duplicates(x))
    return [x[index] for index in indices]

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

print(list_element_duplicates(a))

print("--------------------------------------------------------------------------------")

b = [[10], [15], [20], [10, 10], [10, 15], [10, 20], [15, 10], [15, 15], [15, 20], [20, 10], [20, 15], [20, 20], [10, 10, 10], [10, 10, 15], [10, 10, 20], [10, 15, 10], [10, 15, 15], [10, 15, 20], [10, 20, 10], [10, 20, 15], [10, 20, 20], [15, 10, 10], [15, 10, 15], [15, 10, 20], [15, 15, 10], [15, 15, 15], [15, 15, 20], [15, 20, 10], [15, 20, 15], [15, 20, 20], [20, 10, 10], [20, 10, 15], [20, 10, 20], [20, 15, 10], [20, 15, 15], [20, 15, 20], [20, 20, 10], [20, 20, 15], [20, 20, 20], [10], [15], [20], [10, 10], [10, 15], [10, 20], [15, 10], [15, 15], [15, 20], [20, 10], [20, 15], [20, 20], [10, 10, 10], [10, 10, 15], [10, 10, 20], [10, 15, 10], [10, 15, 15], [10, 15, 20], [10, 20, 10], [10, 20, 15], [10, 20, 20], [15, 10, 10], [15, 10, 15], [15, 10, 20], [15, 15, 10], [15, 15, 15], [15, 15, 20], [15, 20, 10], [15, 20, 15], [15, 20, 20], [20, 10, 10], [20, 10, 15], [20, 10, 20], [20, 15, 10], [20, 15, 15], [20, 15, 20], [20, 20, 10], [20, 20, 15], [20, 20, 20], [10], [15], [20], [10, 10], [10, 15], [10, 20], [15, 10], [15, 15], [15, 20], [20, 10], [20, 15], [20, 20], [10, 10, 10], [10, 10, 15], [10, 10, 20], [10, 15, 10], [10, 15, 15], [10, 15, 20], [10, 20, 10], [10, 20, 15], [10, 20, 20], [15, 10, 10], [15, 10, 15], [15, 10, 20], [15, 15, 10], [15, 15, 15], [15, 15, 20], [15, 20, 10], [15, 20, 15], [15, 20, 20], [20, 10, 10], [20, 10, 15], [20, 10, 20], [20, 15, 10], [20, 15, 15], [20, 15, 20], [20, 20, 10], [20, 20, 15], [20, 20, 20], [10], [15], [20], [10, 10], [10, 15], [10, 20], [15, 10], [15, 15], [15, 20], [20, 10], [20, 15], [20, 20], [10, 10, 10], [10, 10, 15], [10, 10, 20], [10, 15, 10], [10, 15, 15], [10, 15, 20], [10, 20, 10], [10, 20, 15], [10, 20, 20], [15, 10, 10], [15, 10, 15], [15, 10, 20], [15, 15, 10], [15, 15, 15], [15, 15, 20], [15, 20, 10], [15, 20, 15], [15, 20, 20], [20, 10, 10], [20, 10, 15], [20, 10, 20], [20, 15, 10], [20, 15, 15], [20, 15, 20], [20, 20, 10], [20, 20, 15], [20, 20, 20]]

print(list_element_duplicates(b))

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]

计数。使用此选项,您可以执行以下操作:

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]

您可以使用计数器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]

您可以使用计数器dict将子列表映射到tuple,并只获取计数大于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]

问题必须来自以下方面:

if isinstance(element, list):
    element = tuple(element)
if element not in seen:
    seen.add(element)
因此,如果您已经在
seed
中,比如说
[10,15]
,然后您想在seed中选中
[15,10]
,它将返回
FALSE

一个修正,当你考虑<代码> [x,y] 与<代码> [y,x] < /c>一样,就是对你检查的每个元素排序,这样:

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

问题必须来自以下方面:

if isinstance(element, list):
    element = tuple(element)
if element not in seen:
    seen.add(element)
因此,如果您已经在
seed
中,比如说
[10,15]
,然后您想在seed中选中
[15,10]
,它将返回
FALSE

一个修正,当你考虑<代码> [x,y] 与<代码> [y,x] < /c>一样,就是对你检查的每个元素排序,这样:

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

理解列表很容易

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)

理解列表很容易

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)

在不知道您预期的输入/输出的情况下,我不太确定,但我想更改为
element=tuple(sorted(element))
可能会帮助您解决问题。Dupe@PadraicCunningham为什么你认为它不适用于
a
[1,2]
[5,2]
是不是都是重复的?@d3pd,啊,好吧,那么你想保留重复,你的逻辑仍然不正确,不知道你的预期输入/输出我不太确定,但我想改成
元素=元组(排序(元素))
可能会帮你。重复@PadraicCunningham为什么你认为它不适用于
a
[1,2]
[5,2]
重复项不是吗?@d3pd,啊好吧,那么你想保留重复项,你的逻辑仍然不正确。我的错误,帖子已经修复了…:/my bad,post已经修复了…:/@Padraic…如果我错了,正确,但我相信OP想要重复项列表。不?铁拳,是的,最初读错了,只是把==改成>@Padraic的问题…如果我错了,请更正,但我相信OP想要重复列表的列表..否?@IronFist,是的,最初读错了,只是把==改成>