web-dev-qa-db-fra.com

TypeError: unhashable type: 'list' en utilisant la fonction set intégrée

J'ai une liste contenant plusieurs listes en tant qu'éléments

eg: [[1,2,3,4],[4,5,6,7]]

Si j'utilise la fonction set intégrée pour supprimer les doublons de cette liste, le message d'erreur

TypeError: unhashable type: 'list'

Le code que j'utilise est

TopP = sorted(set(TopP),reverse=True)

Où TopP est une liste comme dans l'exemple, par exemple. Au dessus de

Cette utilisation de set () est-elle incorrecte? Existe-t-il un autre moyen de trier la liste ci-dessus? 

31
ami91

Les ensembles exigent que leurs articles soient lavables . En dehors des types prédéfinis par Python, seuls les éléments immuables, tels que les chaînes, les nombres et les n-uplets, sont hashable. Les types mutables, tels que les listes et les dessins, ne sont pas haschables, car une modification de leur contenu modifierait le hachage et romprait le code de recherche.

Puisque vous triez quand même la liste, placez simplement la suppression des doublons après la liste est déjà triée. Ceci est facile à implémenter, n'augmente pas la complexité algorithmique de l'opération et ne nécessite pas de changer de sous-liste en n-uplets:

def uniq(lst):
    last = object()
    for item in lst:
        if item == last:
            continue
        yield item
        last = item

def sort_and_deduplicate(l):
    return list(uniq(sorted(l, reverse=True)))
36
user4815162342
    python 3.2


    >>>> from itertools import chain
    >>>> eg=sorted(list(set(list(chain(*eg)))), reverse=True)
        [7, 6, 5, 4, 3, 2, 1]


   ##### eg contain 2 list within a list. so if you want to use set() function
   you should flatten the list like [1, 2, 3, 4, 4, 5, 6, 7]

   >>> res= list(chain(*eg))       # [1, 2, 3, 4, 4, 5, 6, 7]                   
   >>> res1= set(res)                    #   [1, 2, 3, 4, 5, 6, 7]
   >>> res1= sorted(res1,reverse=True)
1
raton

Ce n'est certainement pas la solution idéale, mais il m'est plus facile de comprendre si je convertis la liste en nuplets puis que je le trie.

mylist = [[1,2,3,4],[4,5,6,7]]
mylist2 = []
for thing in mylist:
    thing = Tuple(thing)
    mylist2.append(thing)
set(mylist2)
0
sparrow