TypeError:unhashable type:'list',尝试创建dict

时间:2016-06-03 23:10:17

标签: python

我的程序中收到以下错误:

Traceback (most recent call last):
  File "bookmarks.py", line 26, in <module>
    zipping = dict(zip(datelist, matchhref))
TypeError: unhashable type: 'list'

我想从两个列表(datelistmatchhref)创建字典,但不知何故,当我使用zip()时,它会返回list而不是tuple

这是我的代码:

import re

bm_raw = open('bookmarks.txt', 'r')

bm_line = bm_raw.read()

matchhref = re.findall('(<DT><A HREF=".*?</A>)', bm_line)
massive = list()
datelist = list()
a = 0

for i in matchhref:

    temp = matchhref[a]
    found = re.findall('(\d\d\d\d\d\d\d\d\d\d)', temp)
    datelist.append(found)
    a=a+1

print datelist
print matchhref
zipping = dict(zip(datelist, matchhref))

这里有bookmarks.txt的内容:

 <DT><A HREF="some random data" ADD_DATE="1460617925" ICON="some random data">priomap</A>
 <DT><A HREF="some random data" ADD_DATE="1455024833" ICON="some random data">V.34</A>

2 个答案:

答案 0 :(得分:1)

正如我评论的那样,您可以调用 re.search 然后 .group()添加字符串而不是列表 findall 返回,因此您可以使用字符串作为键,但BeautifulSoup将使您的生活更轻松:

In [50]:from bs4 import BeautifulSoup, Tag

In [51]: soup = BeautifulSoup(h,"xml")

In [52]: print(dict((dt["ADD_DATE"], dt["HREF"],) for dt in soup.select("DT A[HREF]")))
{u'1455024833': u'some random data', u'1460617925': u'some random data'}

select("DT A[HREF]") DT 标记内找到具有 HREF 属性的所有锚标记A

正则表达式的解决方案是:

    found = re.search('(\d\d\d\d\d\d\d\d\d\d)', temp)     
    datelist.append(found.group())

但是使用像bs4这样的html解析器或类似的东西。

答案 1 :(得分:0)

zip返回元组列表,而不是元组。

此外,如果元组的每个元素都是可清除的,则元组只能是可清除的。因此,列表元组也不会被清除。

也就是说,如果dict(zip(keys, values))是可清除元素列表,keys没有错。您的问题是datelist包含不可清除但不能用作dict密钥的列表(re.findall的结果)。

但实际上,请阅读其他人提供的建议,并且不要使用re来解析HTML。 BeautifulSoup是我的首选工具。