从 python 中的嵌套列表中获取唯一值
Get unique values from a nested list in python
我有一个嵌套列表(列表的列表),我想删除重复项,但出现错误。这是一个例子:
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] ]
看来你想要这样的东西,
>>> 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]]
set
和 dict
容器依赖于数据散列。其他可变容器,如 list
(以及 set
和 dict
本身)不能被散列。它们以后可能会更改(可变),因此常量哈希值没有意义。
但是您可以将所有数据转换为(嵌套的)元组,最后转换为 set
。由于 tuple
是一个 immutable 容器 - 并且您的数据是可哈希的 (strings) - 它可以工作。这是你的特殊 images 案例的一个令人讨厌的单行代码:
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
以确保订单。
您可以使用 compiler.ast.flatten
来展平您的列表,然后将您的字典转换为可散列的对象以抓取集合,然后转换回字典,只需一个列表理解即可:
>>> 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'}]
我有一个嵌套列表(列表的列表),我想删除重复项,但出现错误。这是一个例子:
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] ]
看来你想要这样的东西,
>>> 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]]
set
和 dict
容器依赖于数据散列。其他可变容器,如 list
(以及 set
和 dict
本身)不能被散列。它们以后可能会更改(可变),因此常量哈希值没有意义。
但是您可以将所有数据转换为(嵌套的)元组,最后转换为 set
。由于 tuple
是一个 immutable 容器 - 并且您的数据是可哈希的 (strings) - 它可以工作。这是你的特殊 images 案例的一个令人讨厌的单行代码:
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
以确保订单。
您可以使用 compiler.ast.flatten
来展平您的列表,然后将您的字典转换为可散列的对象以抓取集合,然后转换回字典,只需一个列表理解即可:
>>> 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'}]