Rob*_*zak 4 python list-comprehension
这是一个荒谬而奇怪的用例,但请耐心等待,我有这个列表理解:
"reading_types": [
{
"name": rt.reading_type,
"value": rt.reading_type_id,
}
for unit in item.units
for rt in unit.reading_types
],
Run Code Online (Sandbox Code Playgroud)
在后端api电话中.除了在最终结果中几乎总会有重复之外,它的效果很好.如何确保不返回重复项?
这实际上发生在另一个列表理解中,我无法在任何时候引用列表来删除重复项,所以我必须在列表理解本身内这样做.
我试过用过set
:
set([
{
"name": rt.reading_type,
"value": rt.reading_type_id,
}
for unit in item.units
for rt in unit.reading_types
])
Run Code Online (Sandbox Code Playgroud)
但这会导致错误: unhashable type: dict
我们的想法是让您的结构可以在不破坏它们的情况下进行清洗,这样您就可以将它们恢复原状.
你可以将你的词典转换dict_items
为tuples
(现在我们可以把它放在一个set
因为数据是可以删除的),对它应用一个set
,然后转换回字典:
input_list = [{"name":"name1","id":"id1"},{"name":"name2","id":"id2"},
{"name":"name1","id":"id1"}]
output_list = [dict(items) for items in {tuple(a.items()) for a in input_list}]
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为子字符串的值是可清除的(字符串).如果他们是字典,我们也必须转换它们.
结果:
[{'id': 'id1', 'name': 'name1'}, {'id': 'id2', 'name': 'name2'}]
Run Code Online (Sandbox Code Playgroud)
另一个解决方案(由Jon Clements提供),它不使用a set
而是构建字典(使用字典理解)并使用关键单元来复制重复项,然后仅提取值:
list({tuple(d.items()):d for d in input_list}.values())
Run Code Online (Sandbox Code Playgroud)