我有一个嵌套列表(列表列表),我想删除重复项但我收到错误。这是一个例子:
images = [
[
{
"image_link": "1969.1523.001.aa.cs.jpg",
"catalogue_number": "1969.1523",
"dataset_name": "marine-transportation-transports-maritimes.xml"
},
{
"image_link": "1969.1523.001.aa.cs.jpg",
"catalogue_number": "1969.1523",
"dataset_name": "railway-transportation-transports-ferroviaires.xml"
}
],
[
{
"image_link": "1969.1523.001.aa.cs.jpg",
"catalogue_number": "1969.1523",
"dataset_name": "marine-transportation-transports-maritimes.xml"
},
{
"image_link": "1969.1523.001.aa.cs.jpg",
"catalogue_number": "1969.1523",
"dataset_name": "railway-transportation-transports-ferroviaires.xml"
}
],
[
{
"image_link": "1969.1523.001.aa.cs.jpg",
"catalogue_number": "1969.1523",
"dataset_name": "marine-transportation-transports-maritimes.xml"
},
{
"image_link": "1969.1523.001.aa.cs.jpg",
"catalogue_number": "1969.1523",
"dataset_name": "railway-transportation-transports-ferroviaires.xml"
}
]
]
所以在最后这个images
只会包含
[
[
{
"image_link": "1969.1523.001.aa.cs.jpg",
"catalogue_number": "1969.1523",
"dataset_name": "marine-transportation-transports-maritimes.xml"
},
{
"image_link": "1969.1523.001.aa.cs.jpg",
"catalogue_number": "1969.1523",
"dataset_name": "railway-transportation-transports-ferroviaires.xml"
}
]
]
我正在使用set
功能
set.__doc__
'set() -> new empty set object\nset(iterable) -> new set object\n\nBuild an unor
dered collection of unique elements.'
我的跟踪日志:
list(set(images))
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unhashable type: 'list'
为简化起见,我如何删除此示例中的所有副本
example = [ [{'a':1, 'b':2}, 'w', 2], [{'a':1, 'b':2}, 'w', 2] ]
#result
#example = [[{'a':1, 'b':2}, 'w', 2] ]
答案 0 :(得分:1)
好像你想要这样的东西,
>>> example = [ [{'a':1, 'b':2}, 'w', 2], [{'a':1, 'b':2}, 'w', 2] ]
>>> l = []
>>> for i in example:
if i not in l:
l.append(i)
>>> l
[[{'b': 2, 'a': 1}, 'w', 2]]
答案 1 :(得分:1)
set
和dict
容器依赖于数据散列。其他可变容器(如list
(以及set
和dict
本身)也无法进行哈希处理。它们可能会在以后更改(可变),因此恒定的哈希值没有意义。
但您可以将所有数据转换为(嵌套)元组,最后转换为set
。由于tuple
是一个不可变容器 - 并且您的数据是可清除的(字符串) - 它可以正常工作。对于你的特殊图像案例来说,这是一个令人讨厌的单行内容,可以解决这个问题:
images_Set = set([tuple([tuple(sorted(image_dict.items()))
for image_dict in inner_list]) for inner_list in images])
和
print(images_set)
打印
{((('catalogue_number', '1969.1523'),
('dataset_name', 'marine-transportation-transports-maritimes.xml'),
('image_link', '1969.1523.001.aa.cs.jpg')),
(('catalogue_number', '1969.1523'),
('dataset_name', 'railway-transportation-transports-ferroviaires.xml'),
('image_link', '1969.1523.001.aa.cs.jpg')))}
编辑:字典的items
功能有无保证订单。因此,我还添加了sorted
以确保订单。
答案 2 :(得分:1)
您可以使用compiler.ast.flatten
展平您的列表,然后将您的字典转换为可清除对象以对这些集进行grub,然后转换回dict,只需一个列表理解:
>>> from compiler.ast import flatten
>>> [dict(item) for item in set(tuple(i.items()) for i in flatten(images))]
[{'image_link': '1969.1523.001.aa.cs.jpg', 'catalogue_number': '1969.1523', 'dataset_name': 'marine-transportation-transports-maritimes.xml'}, {'image_link': '1969.1523.001.aa.cs.jpg', 'catalogue_number': '1969.1523', 'dataset_name': 'railway-transportation-transports-ferroviaires.xml'}]