此问题在此处已有答案:
Python, TypeError: unhashable type: 'list'(1个答案)
三年前关闭了。
所以我有以下列表:
test_list = ['Hallo', 42, [1, 2], 42, 3 + 2j, 'Hallo', 'Hello', [1, 2], [2, 3], 3 + 2j, 42]
现在我想从列表中取出唯一值并将其打印在屏幕上。我尝试使用set函数,但不起作用**(类型错误:不可用类型:'list')**,因为列表中的值是[1,2]和[2,3]。我尝试使用append和extend函数,但还没有找到解决方案。
期望值:[“你好”,42,[1,2],(3+2j),“你好”,[2,3]]
def unique_list(a_list):
a = set(a_list)
print(a)
a_list = ['Hallo', 42, [1, 2], 42, 3 + 2j, 'Hallo', 'Hello', [1, 2], [2, 3], 3 + 2j, 42]
print(unique_list(a_list))
5条答案
按热度按时间watbbzwu1#
如果列表包含不可散列的元素,请使用
repr
创建一个可用于set的可散列键:toe950272#
你可以使用一个简单的for循环,它只追加新元素:
dpiehjr43#
为了从非散列列表中获取唯一项,可以通过等价性进行分区,这是一种二次方法,因为它将每个项与每个分区中的一个项进行比较,如果不等于其中一个项,则只为该项创建一个新分区,然后获取每个分区的第一个项。
如果某些项是可散列的,那么可以将等价性的划分限制在非散列项上,并通过集合来填充其余项。
未经测试。
f45qwnt84#
在线性时间内解决这个问题的一种方法是用序列化器(如
pickle
)序列化项,这样列表等不可散列的对象就可以添加到集合中进行重复数据删除,但是由于集合在Python中是无序的,而且你显然希望输出是按照原始插入顺序的,所以你可以改用dict.fromkeys
:因此,给定示例输入,它将返回:
请注意,如果您使用的是Python 3.6或更早版本,其中dicts的键顺序不受保证,则可以使用
collections.OrderedDict
代替dict
。b1payxdu5#
你可以在一个普通的
for
循环中完成,这个循环的运行时间是O(n^2)。也许还有一种方法可以把它变成列表解析,那会更优雅,但是我现在还不知道,如果每个元素都是可散列的,你可以使用
set
方法,那会更简单。