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?
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)))
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)
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)