【问题标题】:TypeError: unhashable type: 'list' by converting list to setTypeError: unhashable type: 'list' 通过将列表转换为集合
【发布时间】:2016-06-29 15:08:14
【问题描述】:

我有一个来自 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))

我怎样才能实现这一点(也许以更优化/更快的方式)?

【问题讨论】:

    标签: python list python-2.7 set


    【解决方案1】:

    每个 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'])
    

    【讨论】:

    • 你是对的。我的错。我应该对数据库请求的结果做同样的事情: res1.append(x[0] for x in res)
    【解决方案2】:

    这是一个可能有用的 sn-p。从文件中提取时,我使用了“扩展”而不是“附加”。它必须是与从文件导入相关的细微差别。

    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'}
    

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 2015-02-11
      • 2021-03-14
      • 2019-10-11
      • 2020-03-27
      • 2020-05-11
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      相关资源
      最近更新 更多