Tengo un diccionario de cadenas como la clave con diferente orden de palabras. ¿Cómo puedo eliminar claves duplicadas (las mismas palabras configuradas con un orden diferente)? Los valores son los mismos para las mismas claves, por lo que solo debe seleccionar 1 de ellas.

La idea simple era usar set(words) como clave, pero el diccionario no permite un set como clave. ¿Hay una manera agradable y ordenada de manejar esto?

my_dict={'Hello tom': 2, 'tom Hello': 2, 'I ate apple': 4, 'ate I apple': 4, 'apple ate I':4}

Resultado

my_dict_trimmed={'Hello tom': 2, 'I ate apple': 4}
0
notilas 16 feb. 2017 a las 03:56

4 respuestas

La mejor respuesta

Cada vez que desee hacer un hash de un conjunto, use un frozenset.

output = dict()
for key, value in dictionary.iteritems():
    new_key = frozenset(key.split())
    if new_key not in output.keys():
         output[new_key] = value
2
Batman 16 feb. 2017 a las 01:18

Veo un problema o dos

Simplemente usando sorted falla en anagramas
sus palabras que necesitan ser ordenadas después de dividir

my_dict={'Hello tom':2, 'tom Hello':2, 'I ate apple':4, 'ate I apple':4, 'apple ate I':4}

def MashedKey(k):
    return tuple(sorted(k.split()))

umsk = set([MashedKey(k) for k in my_dict.keys()]) # unique Mashed keys

umsk
Out[48]: {('Hello', 'tom'), ('I', 'apple', 'ate')}

Entonces la clave, los pares de valores deben recuperarse de my_dict a través de la misma función de 'combinación' de claves, tomando aquí la primera igualdad:

od = {}
for u in umsk:
    for k, v in my_dict.items():
        if MashedKey(k) == u:
            od.update({k: v})
            break

od
Out[50]: {'Hello tom': 2, 'apple ate I': 4}
0
f5r5e5d 16 feb. 2017 a las 03:26

Utilice frozenset, que es inmutable y hashable.

1
juanpa.arrivillaga 16 feb. 2017 a las 01:00

Tratar:

my_dict={'Hello tom':2, 'tom Hello':2, 'I ate apple':4, 'ate I apple':4, 'apple ate I':4}

my_dict_trimmed = dict()

for k in my_dict:
    if sorted(k) in map(sorted, my_dict_trimmed):
        continue
    else:
        my_dict_trimmed[k] = my_dict[k]

Espero que esto ayude.

0
Abdou 16 feb. 2017 a las 01:08