2016-05-07 4 views
3

У меня есть список, содержащий словари с буквами и частотами. В принципе, у меня есть 53 словаря для каждого алфавита (в нижнем и верхнем регистре) и пробела.Получение ключевых значений из списка словарей

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

Если вы введете слово, оно сканирует слово и обновит его соответствующую букву.

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 

Например, я ввести слово «Привет», буквы Н, е, л, L, О детектировании и его частоты обновляется. Ненулевые частоты будут перенесены в новый список.

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

После этого у меня был newArr, отсортированный по частоте и перенесенный в новый список под названием finalArr. Ниже приведен примерный список содержимого для слова «Hello»

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

Теперь я хочу, чтобы передать только ключевые значения для 2 отдельных списков; letterArr и numArr. Как мне это сделать? мой желаемый выход:

letterArr = [H,e,o,l] 
numArr = [1,1,1,2] 
+3

У вас есть три отдельных словарей. Они никоим образом не связаны. Это означает, что между ними нет простого способа перебора. Почему каждый из ваших словарей содержит только два элемента? Почему бы не использовать один словарь, используя букву в качестве ключа и частоту в качестве значения? – Neel

+1

Почему у вас есть 53 словаря в первую очередь? Вы можете сделать это как 'freq_dict = {'a': 0, 'b': 0, ...}'. Тогда было бы легко перенести частоты в список. – Selcuk

+0

Просто мне легче понять. В основном мой последний список - это всего лишь список словарей. – Learner

ответ

3

Почему вы не просто использовать collections.Counter? Например:

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) 

Обратите внимание на использование sorted() для сортировки путем увеличения частоты. itemgetter() используется для изменения порядка сортировки, чтобы сортировка выполнялась сначала по частоте, а затем по букве. Затем отсортированные частоты разделяются с использованием zip() в списке без распаковки.

Demo

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

Результаты кортежи, но вы можете преобразовать в списки, если вы хотите с list(letter_arr) и list(num_arr).

+0

Не думал об этом раньше. Вы, сэр, очень благодарны! Просто сделал мой код короче. Все еще нужно многому научиться на питоне. – Learner

1

У меня есть трудное понимание вашей структуры данных для этой проблемы. Почему вы не просто идти со словарем, как это:

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

который еще проще реализовать с помощью счетчика:

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

Затем добавить еще одно слово, вы просто должны использовать update метод:

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

Наконец, чтобы получить свои 2 массивы, вы можете сделать:

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

Это даст вам кортежи, хотя, если вам действительно нужны списки, просто сделать: list(letterArr)

0

Вам нужен простой ответ, без дальнейших неприятностей, таких как zip, коллекции, itemgetter и т. Д. Это делает минимум, чтобы сделать это, 3 строки в цикле.

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 

Выход

['H', 'e', 'o', 'l'] 
[1, 1, 1, 2]