2015-11-26 4 views
0

Я использую два списка: files и g_list, которые были обычными списками. Я хотел удалить дубликаты с files и получить g_list матч. Я нашел это решение;Удалить дубликаты из вложенного списка, используя список в виде ключей

from collections import OrderedDict as odict  
od = odict.fromkeys(zip(files, g_list)) 
files, g_list = zip(*od) 

Я так модифицирована g_list быть вложенный список, но теперь, когда я бегу выше код я получаю это TypeError:

File "/usr/lib/python2.7/collections.py", line 199, in fromkeys 
    self[key] = value 
File "/usr/lib/python2.7/collections.py", line 58, in __setitem__ 
    if key not in self: 
TypeError: unhashable type: 'list' 

Как это исправить? Или есть другой способ сделать то, что я желаю?

Edit:

Вход:

files = ['red', 'green', 'blue', 'green', 'yellow'] 
g_list = [['x','y'], ['z'], ['q','r','x'], ['z'], ['x', 'r']] 

Желаемая Выход:

files = ['red', 'green', 'blue', 'yellow'] 
g_list = [['x','y'], ['z'], ['q','r','x'], ['x', 'r']] 
+0

Вместо этого используйте 'tuple'. Может быть так же просто, как 'tuple (my_list)' – ZWiki

+0

Возможный дубликат [TypeError: unhashable type: 'dict', когда dict используется как ключ для другого dict] (http://stackoverflow.com/questions/4531941/typeerror- unhashable-type-dict-when-dict-used-as-a-key-for-another-dict) – rll

+0

Использование кортежа не удаляет дубликаты. 'Len (files)' до и после дает тот же результат. – p014k

ответ

1

Это следует за тем, что вы пытались сделать, но без импорта других библиотек.

d = dict(zip(files, g_list)) 
files = d.keys() 
g_list = d.values() 
1

Списки не могут быть использованы в качестве ключей в словарях, как они изменяемые, они могут быть изменены , поэтому их нельзя хэшировать. Ну, они могут be hashed, но этот хеш может измениться. Поскольку словарь полагается на хэширование своих ключей, чтобы быть эффективными, хеши должны оставаться постоянными. Таким образом, решение должно использовать кортеж , который точно соответствует списку, за исключением того, что он неизменен. Чтобы преобразовать список L в кортеж, просто сделайте tuple(L).

+0

Хороший ответ, вы получили мой голос –

+0

[Посмотреть комментарий] (http://stackoverflow.com/questions/33928870/remove-duplicates-fested-list-using-list-as-keys?noredirect=1# comment55618814_33928870) – p014k

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