TypeError:unhashable type:'list',将list转换为set

Gab*_*bor 2 python list set python-2.7

我有一个来自csv文件的代码列表:

file_path = 'c:\\temp\\list.csv'
csvfile =  open(file_path, 'rb')
reader = csv.reader(csvfile, delimiter=';')
rr = []
for sor in reader:
    if sor[1][0] == '1':
        rr.append(sor)
print type(rr)
<type 'list'>

set (rr)
Traceback (most recent call last):
  File "<pyshell#85>", line 1, in <module>
    set (rr)
TypeError: unhashable type: 'list'
Run Code Online (Sandbox Code Playgroud)

如果我在来自数据库的其他列表上执行相同操作,则可以正常工作:

cur.execute('select code from mytable')
res = cur.fetchall()
res1 = []
res1.append(x[0] for x in res)
print type(res1)
<type 'list'>
set(res1)
set(['13561255', '11120088'])
Run Code Online (Sandbox Code Playgroud)

rr和res1有什么区别,因为它们都是列表类型?

实际上我正在寻找数据库中的记录,这些记录在csv文件中不存在

result = list(set(res1) - set(rr))
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点(可能以更优/更快的方式)?

ale*_*cxe 9

每个sor都是一个csv行 - 一行"单元格"值,rr成为一个列表列表.由于列表不可清除,因此列表不能是集合中的项目.

res1另一方面是字符串值列表.字符串可以清洗.


这是一个展示差异的示例:

>>> l1 = [["1", "2", "3"]]
>>> l2 = ["1", "2", "3"]
>>> 
>>> set(l1)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    set(l1)
TypeError: unhashable type: 'list'
>>> set(l2)
set(['1', '3', '2'])
Run Code Online (Sandbox Code Playgroud)