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是否重要,但将所有列表成员转换为元组
会破坏其先前域的功能。也就是说,它不再适用于简单的整数列表。