我有一个来自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'
如果我在来自数据库的其他列表中执行相同操作,则可以正常工作:
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'])
rr和res1有什么区别,因为它们都是列表类型?
实际上,我正在寻找数据库中的记录,而这些记录并不存在于csv文件中
result = list(set(res1) - set(rr))
我如何实现这一目标(可能以更优/更快的方式实现)?
答案 0 :(得分:9)
每个sor
都是csv行 - 行“单元格”值列表,rr
成为列表列表。由于列表为not hashable ,因此列表不能是集合中的项目。
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'])
答案 1 :(得分:0)
下面是一个片段,可能会有所帮助。从文件中提取文件时,我使用“扩展”而不是“附加”。必须与从文件导入有关的细微差别。
base = ['dunk', 'slump', 'monk']
with open('dummytext.txt', 'r') as c_h_f:
c_h = []
for line in c_h_f:
line = line.strip()
tokens = line.split(',')
c_h.extend(tokens)
s1 = set(base)
s2 = set(c_h)
print(s1)
print(s2)
Output...
{'slump', 'monk', 'dunk'}
{' lump', 'bunk', ' slump', ' monk', ' funk', ' junk', ' stump', ' dunk'}