Python 如果元素是列表,那么应该如何获得列表重复元素的索引?

Python 如果元素是列表,那么应该如何获得列表重复元素的索引?,python,list,recursion,duplicates,Python,List,Recursion,Duplicates,我可以定义一个函数,返回列表中重复元素的索引: >>> def indices_of_list_element_duplicates(x): ... seen = set() ... seen_add = seen.add ... return [index for index, element in enumerate(x)\ ... if element in seen or seen_add(element)] ... 此函数适

我可以定义一个函数,返回列表中重复元素的索引:

>>> def indices_of_list_element_duplicates(x):
...     seen = set()
...     seen_add = seen.add
...     return [index for index, element in enumerate(x)\
...         if element in seen or seen_add(element)]
... 
此函数适用于简单列表:

>>> a = [1, 2, 3, 3, 4, 3]
>>> indices_of_list_element_duplicates(a)
[3, 5]
如何更改此函数以使其在以列表为元素的列表上工作

>>> b = [[1, 1], [2, 2], [3, "d"], [3, "d"], [4, 4], [3, "d"]]
>>> indices_of_list_element_duplicates(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in indices_of_list_element_duplicates
TypeError: unhashable type: 'list'
>>b=[[1,1]、[2,2]、[3,d”]、[3,d”]、[4,4]、[3,d”]
>>>索引列表元素副本(b)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第5行,在重复元素的索引中
TypeError:不可损坏的类型:“列表”

列表对象不可散列,因此不能将它们存储在
集中
,可以将它们转换为可散列的元组

此外,作为查找重复项的一种更具python风格的方法,您最好使用字典将项保留为键,并将列表中的索引和索引保留为值

>>> Counter_obj={}
>>> 
>>> for i,j in enumerate(map(tuple,b)):
...     Counter_obj.setdefault(j,[]).append(i)
... 
>>> Counter_obj
{(3, 'd'): [2, 3, 5], (4, 4): [4], (1, 1): [0], (2, 2): [1]}
然后可以使用嵌套列表返回长度大于2的值(索引):

>>> [i for val in Counter_obj.values() for i in val if  len(val)>2]
[2, 3, 5]
如果您想在函数中使用它作为更通用的方式,您可以使用以下方法来包装这两种情况:

def indices_of_list_element_duplicates(x,Counter_obj={}):
     try:
        for i,j in enumerate(map(tuple,b)):
            Counter_obj.setdefault(j,[]).append(i)
     except TypeError:
        for i,j in enumerate(b):
            Counter_obj.setdefault(j,[]).append(i)
     return [i for val in Counter_obj.values() for i in val if len(val)>2]

列表对象不可散列,因此不能将它们存储在
集中
,可以将它们转换为可散列的元组

此外,作为查找重复项的一种更具python风格的方法,您最好使用字典将项保留为键,并将列表中的索引和索引保留为值

>>> Counter_obj={}
>>> 
>>> for i,j in enumerate(map(tuple,b)):
...     Counter_obj.setdefault(j,[]).append(i)
... 
>>> Counter_obj
{(3, 'd'): [2, 3, 5], (4, 4): [4], (1, 1): [0], (2, 2): [1]}
然后可以使用嵌套列表返回长度大于2的值(索引):

>>> [i for val in Counter_obj.values() for i in val if  len(val)>2]
[2, 3, 5]
如果您想在函数中使用它作为更通用的方式,您可以使用以下方法来包装这两种情况:

def indices_of_list_element_duplicates(x,Counter_obj={}):
     try:
        for i,j in enumerate(map(tuple,b)):
            Counter_obj.setdefault(j,[]).append(i)
     except TypeError:
        for i,j in enumerate(b):
            Counter_obj.setdefault(j,[]).append(i)
     return [i for val in Counter_obj.values() for i in val if len(val)>2]

可以使用以下生成器函数生成重复元素的索引。请注意,这仍然适用于简单的整数列表、列表列表或两者

>>> def index_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
... 
>>> b = [[1, 1], [2, 2], [3, 'd'], [3, 'd'], [4, 4], [3, 'd'], 4, 4]
>>> list(index_of_list_element_duplicates(b))
[3, 5, 7]

可以使用以下生成器函数生成重复元素的索引。请注意,这仍然适用于简单的整数列表、列表列表或两者

>>> def index_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
... 
>>> b = [[1, 1], [2, 2], [3, 'd'], [3, 'd'], [4, 4], [3, 'd'], 4, 4]
>>> list(index_of_list_element_duplicates(b))
[3, 5, 7]

您希望它如何处理列表列表?我基本上可以看到三种方式。(1.)对外部列表中的单个列表像以前一样工作,(2.)像以前一样工作,但对重复列表进行比较(如,
[1,2]
发生两次),(3.)像以前一样工作,但仅对嵌套列表(而不是,比如说,对常规整数列表)。您希望它如何对列表列表工作?我基本上可以看到三种方式。(1.)对外部列表中的单个列表像以前一样工作,(2.)像以前一样工作,但对重复列表进行比较(如,
[1,2]
发生两次),(3.)像以前一样工作,但仅对嵌套列表(而不是,比方说,对常规整数列表)。不确定这对操作是否重要,但将所有列表成员转换为
tuple
会破坏其先前域的功能。也就是说,它不再适用于简单的整数列表。不确定这对OP是否重要,但将所有列表成员转换为
元组
会破坏其先前域的功能。也就是说,它不再适用于简单的整数列表。