Tengo dos listas y necesito para clasificar sus elementos con la Borda de posición de la clasificación. así que he hecho esta función, pero tengo este error:

TypeError: unhashable type: 'list'. 

Como se indica por otras respuestas El problema es que no puedo usar una lista como la clave en un diccionario, ya que dict teclas deben ser inmutables.Así que he usado una tupla en su lugar, pero el error sigue.

The files of the two lists look like this
list1 = [([('diritti', 'S'), ('umani', 'A')]), ([('violazioni', 'S'), ('dei', 'E'), ('diritti', 'S'), ('umani', 'A')]), ([('forze', 'S'), ('di', 'E'), ('sicurezza', 'S')]), ([('violazioni', 'S'), ('dei', 'E'), ('diritti', 'S')]), ([('Nazioni', 'SP'), ('Unite', 'SP')]), ([('anni', 'S'), ('di', 'E'), ('carcere', 'S')])] 
list2 = [([('anni', 'S'), ('di', 'E'), ('carcere', 'S')]), ([('diritti', 'S'), ('umani', 'A')]), ([('forze', 'S'), ('di', 'E'), ('sicurezza', 'S')]), ([('violazioni', 'S'), ('dei', 'E'), ('diritti', 'S'), ('umani', 'A')]), ([('violazioni', 'S'), ('dei', 'E'), ('diritti', 'S')]), ([('Nazioni', 'SP'), ('Unite', 'SP')]), ([('uso', 'S'), ('eccessivo', 'A'), ('della', 'E'), ('forza', 'S')])] 

Puedo abrir los dos archivos como en esta lista

list1 = codecs.open('/home/list1', 'r', 'utf-8').read()
list2 = codecs.open('/home/list2', 'r', 'utf-8').read()
li = ast.literal_eval(list1)
lii = ast.literal_eval(list2)

def borda_sort(lists):
###Borda’s positional ranking combines ranked lists using information of the ordinal ranks of the elements in each list.Given lists t1, t2, t3 ... tk, for each candidate c and list ti, the score B ti (c) is the number of candidates ranked below c in ti. So The total Borda score is B(c) = ∑ B ti (c) The candidates are then sorted by descending Borda scores. Given the lists = [ ['a', 'c'], ['b', 'd', 'a'], ['b', 'a', 'c', 'd'] ], the output will be ['b', 'a', 'c', 'd']
    scores = {}
    for l in lists:
        for idx, elem in enumerate(reversed(l)):
            if not elem in scores:
                scores[elem] = 0
            scores[elem] += idx
    return sorted(scores.keys(), key=lambda elem: scores[elem], reverse=True)

lists = zip(li, lii)
print borda_sort(lists)

Alguien puede ayudarme?

  • Las listas no se pueden utilizar como teclas de dict. Tal vez el casting de las listas para las cadenas de resolver su problema?
  • Duplicado de this.
  • Tal vez un reflejo de su lista con un diccionario?
  • Usted dice que usted utiliza una tupla, pero no la puedo ver en cualquier lugar. Nos puede decir que la línea del error viene?
  • Podría dar algunos ejemplos de entrada en lista1 y lista2 y los resultados esperados?
  • relacionado: se puede usar json para almacenar las listas en lugar de Python literales (ast.literal_eval()).

InformationsquelleAutor sss | 2015-05-16

2 Comentarios

  1. 2

    Desde sus listas de elementos complejos (tupla de la lista de tuplas de cuerdas), tienen que ser convertidos a contener las tuplas de las tuplas de las cadenas para que se hashable. Como este:

    list1a = [ tuple(x) for x in list1 ]
    list2a = [ tuple(x) for x in list2 ]
    
    print borda_sort([list1a, list2a])
    
    # prints [(('diritti', 'S'), ('umani', 'A')), (('forze', 'S'), ('di', 'E'), ('sicurezza', 'S')), (('violazioni', 'S'), ('dei', 'E'), ('diritti', 'S'), ('umani', 'A')), (('anni', 'S'), ('di', 'E'), ('carcere', 'S')), (('violazioni', 'S'), ('dei', 'E'), ('diritti', 'S')), (('Nazioni', 'SP'), ('Unite', 'SP')), (('uso', 'S'), ('eccessivo', 'A'), ('della', 'E'), ('forza', 'S'))]

    RESPUESTA anterior Si usted tiene lista1 y lista2, la forma de llamar a esta función es borda_sort([list1, list2]) (o borda_sort((list1, list2)), ya sea funciona de la misma). Si las listas contienen los elementos individuales en el mismo orden que desea utilizar para el borda, la respuesta es hacer una lista de listas, no para comprimir tus listas. Creo que zip() no hace lo que piensa. zip hace una lista de pares de un par de listas, como este:

    >>> zip((1, 2, 3), ('a', 'b', 'c'))
    [(1, 'a'), (2, 'b'), (3, 'c')]
  2. 2

    Utilizar una tupla en lugar de listas. Ellos pueden ser usados como claves en los diccionarios. Suponiendo que las listas tienen un número fijo de elementos. I. e. len(lista) es el mismo para todas las listas y constante.

    scores = {}
    for l in lists:
        for idx, elem in enumerate(reversed(l)):
            if not elem in scores:
                scores[tuple(elem)] = 0    #Notice that i have converted list to a tuple.
            scores[tuple(elem)] += idx     #Notice that i have converted list to a tuple.
    return sorted(scores.keys(), key=lambda elem: scores[tuple(elem)], reverse=True) #Notice that i have converted list to a tuple.
    • Traceback (la mayoría de llamada reciente last): File «/home/», línea 48, en <módulo> imprimir borda_sort(listas) File «/home/fat.py», línea 42, en borda_sort si no elem en las puntuaciones: TypeError: unhashable tipo: ‘lista’
    • Se olvidó de cambiar de una lista a la tupla. Voy a actualizar el código de arriba. Sin embargo, el punto principal es que se debe cambiar todas las listas que se supone que deben ser las claves para tuplas.
    • el error sigue: TypeError: unhashable tipo: ‘lista’

Dejar respuesta

Please enter your comment!
Please enter your name here