Python 删除列表中的重复元组和列表
我有一个python元组和列表列表:Python 删除列表中的重复元组和列表,python,list,tuples,list-comprehension,Python,List,Tuples,List Comprehension,我有一个python元组和列表列表: gammagammalambda = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('r', 'w'), ('p',
gammagammalambda = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]
在哪里
与
[[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]
现在,我想删除这些双元素,以便
[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]
为此,我想使用列表理解,我已经尝试了
main_set = set(tuple(frozenset(innermost_list) for innermost_list in sublist) for sublist in gammagammalambda)
但我得到了一个错误:
TypeError: unhashable type: 'list'
希望您能帮助我。一个备选方案是:
gammagammalambda = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
[[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]],
[[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
[[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]
d = {frozenset(e[0]) : e for e in reversed(gammagammalambda)}
result = list(d.values())
print(result)
输出
[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]
[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]
创建一个字典,其中键表示必须唯一的值,对于每个键设置为Gammagammalabda
的整个元素的值,最后唯一的值是字典d
的值
或者更直接的选择:
gammagammalambda = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
[[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]],
[[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
[[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]
seen = set()
result = []
for e in gammagammalambda:
key = frozenset(e[0])
if key not in seen:
result.append(e)
seen.add(key)
print(result)
输出
[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]
[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]
类似于,list
不可散列,tuple
和frozenset
可散列
您可以相应地定义“唯一性密钥”,并使用,也可以在第三方库中作为或提供:
[[('p','u'),('r','w'),[[[],['q','s'],['t','v'],[],
[[('p','w'),('r','u')],[[[],['q','s'],['t','v'],[]]]
您是如何得到这种嵌套列表结构的?使用list.pop;)很酷,非常感谢。“你从哪里学来的这些东西?”阿玛尼42我从stackoverflow上的问答中学到的大部分东西。此外,许多PyCon讲座和教程也会有所帮助。似乎假设
['q','s',['t','v']
位不必相同,以确保唯一性。我不确定是否是这种情况,可能是输入数据不具有代表性。问题是,我通过使用一个自编类获得这些对象。如果你想的话,我可以把代码发给你。
[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
[[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]