我有一份清单清单:
mat = [[1,2,3],[4,5,6],[1,2,3],[7,8,9],[4,5,6]]
Run Code Online (Sandbox Code Playgroud)
我想转换成一个集合,即删除重复列表并从中创建一个新列表,它只包含唯一列表.
在上述情况下,所需答案将是
[[1,2,3],[4,5,6],[7,8,9]]
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时set(mat),它给了我错误
TypeError:不可用类型:'list'
你能解决我的问题吗?提前致谢!
the*_*eye 22
由于列表是可变的,因此无法进行哈希处理.最好的办法是将它们转换为元组并形成一组,就像这样
>>> mat = [[1,2,3],[4,5,6],[1,2,3],[7,8,9],[4,5,6]]
>>> set(tuple(row) for row in mat)
set([(4, 5, 6), (7, 8, 9), (1, 2, 3)])
Run Code Online (Sandbox Code Playgroud)
我们一次遍历mat一个列表,将其转换为元组(这是不可变的,所以sets很酷),生成器被发送到set函数.
如果您希望结果作为列表列表,您可以通过将set函数调用的结果转换为列表来扩展它,就像这样
>>> [list(item) for item in set(tuple(row) for row in mat)]
[[4, 5, 6], [7, 8, 9], [1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)
@thefourtheye 的答案清楚地描述了您在不可散列数据类型方面面临的问题以及绕过它的方法,以便您可以创建一个集合并删除重复项。这应该足以解决大多数问题,但是,重新阅读你的问题
在上述情况下,所需的答案将是 [[1,2,3],[4,5,6],[7,8,9]]。
如果顺序很重要,则需要使用OrderedDict
>>> from collections import OrderedDict
>>> map(list, OrderedDict.fromkeys(map(tuple, mat)).keys())
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)
列表是可变的,因此不可用.改为使用元组
In [114]: mat = [[1,2,3],[4,5,6],[1,2,3],[7,8,9],[4,5,6]]
In [115]: mat = [tuple(t) for t in mat]
In [116]: matset = set(mat)
In [117]: matset
Out[117]: {(1, 2, 3), (4, 5, 6), (7, 8, 9)}
In [118]: [list(t) for t in matset]
Out[118]: [[4, 5, 6], [7, 8, 9], [1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)