2016-03-16 3 views
0

Я пытаюсь получить разницу между dict1 и dict2, но я продолжаю получать любую помощь?type error python unhashable type

ret = {} 
third_value_list =[0,1] 
for i in third_value_list: 
    #print i 
    num_list = [1,2] 
    val_list = [0,1] 
    dict1 = dict((k, [v]+[i]) for (k, v) in zip(num_list,val_list)) 
    print dict1 
    num_list2= [1,2] 
    val_list2 = [0,6] 
    dict2 = dict((k, [v]+[i]) for (k, v) in zip(num_list2,val_list2)) 
    print dict2 
if set(dict2.items()) - set(dict1.items()): 
    print 'true' 
    a = set(dict1.items()) - set(dict2.items()) 
    ret.update (a) 
    print ret 

Выходы:

{1: [0, 0], 2: [1, 0]}

Traceback (самый последний вызов последнего):

Файл «C: \ Randstad-ISS \ workspace \ pattern2 \ src \ pat2 \ t4.py ", строка 46, в

если установлено (dict2.items()) - set (dict1.items()): TypeError: unhashable type: «список»

{1: [0, 0], 2: [6, 0]}

{1: [0, 1], 2: [1, 1]}

{1: [0, 1], 2: [6, 1]}

+0

Возможный дубликат [Python: Добавить список для установки] (http://stackoverflow.com/questions/1306631/python-add-list-to-set) – badcook

ответ

1

Попробуйте этот код. Основная идея - преобразовать значения [v]+[i] в dict1 и dict2 в кортеж, затем рассчитать разницу в dict1 и dict2. Наконец, преобразуйте значения типа кортежа обратно в список.

ret = {} 
third_value_list =[0,1] 
for i in third_value_list: 
    #print i 
    num_list = [1,2] 
    val_list = [0,1] 
    dict1 = dict((k, tuple([v]+[i])) for (k, v) in zip(num_list,val_list)) 
    print dict1 
    num_list2= [1,2] 
    val_list2 = [0,6] 
    dict2 = dict((k, tuple([v]+[i])) for (k, v) in zip(num_list2,val_list2)) 
    print dict2 

if set(dict2.items()) - set(dict1.items()): 
    print 'true' 
    a = dict(set(dict1.items()) - set(dict2.items())) 
    a = dict((k, [i for i in v]) for (k, v) in zip(a.keys(), a.values())) 
    ret.update (a) 
    print ret 
+0

Что здесь происходит? я не понимаю, почему вы положили dict впереди: a = dict (set (dict1.items()) - set (dict2.items())) то, что здесь происходит: a = dict ((k, [v]) для (k, v) в zip (a.keys(), a.values ​​())) – Testerflorida

+0

@Testerflorida, я модифицировал последнюю 3-ю строку от a = dict ((k, [v]) ... до = dict ((k, [i для i в v]) ... Без двух строк результат будет {2: (1, 1)}.С помощью двух строк результат равен {2: [1, 1]}. Надеюсь, поможет. – Yunhe

+0

Это действительно помогает. Я просто пытался понять большое спасибо – Testerflorida

1

Для того чтобы добавить объект в набор, он должен быть hashable. Только неизменяемые объекты хешируются, и поскольку dict1 содержит списки, которые изменяются, вы получаете ошибку.

Из документации Python:

An object is hashable if it has a hash value which never changes during its lifetime (it needs a hash() method), and can be compared to other objects (it needs an eq() or cmp() method). Hashable objects which compare equal must have the same hash value.

Hashability makes an object usable as a dictionary key and a set member, because these data structures use the hash value internally.

All of Python’s immutable built-in objects are hashable, while no mutable containers (such as lists or dictionaries) are. Objects which are instances of user-defined classes are hashable by default; they all compare unequal (except with themselves), and their hash value is derived from their id().

1

ошибка происходит в set(dict2.items()). Вы пытаетесь поместить (1, [0,1]) и (2, [1,1]) (это «элементы» в словаре) в набор. Чтобы быть помещенным в набор, элементы должны быть хэшированы. Они не могут быть хэшированы, потому что они содержат список. Список не сотрясается, потому что его можно изменить, список изменен. Могут быть хэшированы только неизменные объекты.

Необязательная версия списка - это кортеж. Кортеж по существу является списком, который нельзя изменить. Существуют и другие неизменные версии общих типов данных, такие как фризонсет вместо наборов.

Измените эти списки на кортежи, и вы сможете их использовать!

+0

я изменил к кортежу, но как я могу найти разницу между ними? – Testerflorida

+0

Что вы понимаете под «найти разницу между ними» – Jules

+0

dict2 = tuple ((k, [v] + [i]) для (k, v) в zip (num_list2, val_list2)) если установлено (dict2. items()) - set (dict1.items()): Я не могу использовать набор, если я перехожу к кортежу – Testerflorida

Смежные вопросы