如何在OrderedDicts列表中获取重复元素的索引?

时间:2017-04-11 13:59:59

标签: set ordereddictionary

我有一个OrderedDicts列表,我希望获得重复元素列表中的索引。从概念上讲,它有点像下面的示例,其中包含int s列表:

>>> 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
... 
>>> a = [1, 2, 3, 4, 5, 6, 1, 1, 9, 1]
>>> indices = [index for index in indices_of_list_element_duplicates(a)]
>>> indices
[6, 7, 9]

如何为OrderedDicts列表完成相同的操作?当我在OrderedDicts上尝试此功能时,遇到以下错误:

TypeError: unhashable type: 'OrderedDict'

1 个答案:

答案 0 :(得分:1)

from collections import OrderedDict
# ...
if isinstance(element, OrderedDict):  # checking for type dict would be enough
    element = tuple(element.items())
# ...

这会将字典转换为元组元组,而元组元组又可以是元素的元素。之前,您尝试将对象添加到set,但未实现散列。

请注意,给定的字典必须以递归方式限制为可缓存的值类型。否则你会遇到类似的问题。

from collections import OrderedDict
d = OrderedDict(a=[1,2,3])
set().add(tuple(d.items()))
TypeError: unhashable type: 'list'