Tengo una lista que contiene diccionarios con letras y frecuencias. Básicamente, tengo 53 diccionarios cada uno para cada alfabeto (minúscula y mayúscula) y espacio.

adict = {'Letter':'a', 'Frequency':0}
bdict = {'Letter':'b', 'Frequency':0}
cdict = {'Letter':'c', 'Frequency':0}

Si ingresa una palabra, la escaneará y actualizará la frecuencia de su letra correspondiente.

for ex in range(0, len(temp)):
    if temp[count] == 'a': adict['Frequency']+=1
    elif temp[count] == 'b': bdict['Frequency']+=1
    elif temp[count] == 'c': cdict['Frequency']+=1

Por ejemplo, ingreso la palabra "Hola". Se detectan las letras H, e, l, l, o y se actualizan sus frecuencias. Las frecuencias distintas de cero se transferirán a una nueva lista.

if adict['Frequency'] != 0 : newArr.append(adict) 
if bdict['Frequency'] != 0 : newArr.append(bdict)
if cdict['Frequency'] != 0 : newArr.append(cdict) 

Después de esto, ordené el newArr por Frecuencia y lo transfirí a una nueva lista llamada finalArr. A continuación se muestra una lista de contenidos de la palabra "Hola"

{'Letter': 'H', 'Frequency': 1}
{'Letter': 'e', 'Frequency': 1}
{'Letter': 'o', 'Frequency': 1}
{'Letter': 'l', 'Frequency': 2}

Ahora lo que quiero es transferir solo los valores clave a 2 listas separadas; letras y numBer. ¿Cómo hago esto? mi salida deseada es:

letterArr = [H,e,o,l]
numArr = [1,1,1,2]
3
Learner 7 may. 2016 a las 15:02

3 respuestas

La mejor respuesta

¿Por qué no usas un collections.Counter ? Por ejemplo:

from collections import Counter
from operator import itemgetter

word = input('Enter a word: ')
c = Counter(word)

letter_arr, num_arr = zip(*sorted(c.items(), key=itemgetter(1,0)))
print(letter_arr)
print(num_arr)

Tenga en cuenta el uso de sorted() para ordenar aumentando la frecuencia. itemgetter() se usa para invertir el orden de clasificación, de modo que la clasificación se realice primero en la frecuencia y luego en la letra. Las frecuencias ordenadas se separan usando zip() en la lista desempaquetada.

Demostración

Enter a word: Hello
('H', 'e', 'o', 'l')
(1, 1, 1, 2)

Los resultados son tuplas, pero puede convertirlas en listas si lo desea con list(letter_arr) y list(num_arr).

3
mhawke 7 may. 2016 a las 12:31

Querías una respuesta simple sin más tareas como zip, colecciones, artículos, etc. Esto hace lo mínimo para hacerlo, 3 líneas en un bucle.

finalArr= [{'Letter': 'H', 'Frequency': 1},
           {'Letter': 'e', 'Frequency': 1},
           {'Letter': 'o', 'Frequency': 1},
           {'Letter': 'l', 'Frequency': 2}]

letterArr = []
numArr    = []
for i in range(len(finalArr)):
    letterArr.append(finalArr[i]['Letter'])
    numArr.append(finalArr[i]['Frequency'])
print letterArr
print numArr

La salida es

['H', 'e', 'o', 'l']
[1, 1, 1, 2]
0
Marichyasana 7 may. 2016 a las 13:11

Me cuesta entender su elección de estructura de datos para este problema. ¿Por qué no vas con un diccionario como este?

frequencies = { 'H': 1, 'e': 1, 'l': 2, 'o': 1 }

Lo cual es aún más fácil de implementar con un contador:

from collections import Counter
frequencies = Counter("Hello")
print(frequencies)
>>> Counter({ 'H': 1, 'e': 1, 'l': 2, 'o': 1 })

Luego, para agregar otra palabra, simplemente tendría que usar el método update:

frequencies.update("How")
print(frequencies)
>>> Counter({'l': 2, 'H': 2, 'o': 2, 'w': 1, 'e': 1})

Finalmente, para obtener sus 2 matrices, puede hacer:

letterArr, numArr = zip(*frequencies.items())

Sin embargo, esto le dará tuplas, si realmente necesita listas, simplemente haga: list(letterArr)

1
Adrien El Zein 7 may. 2016 a las 12:28