2014-02-01 3 views
0

Я пытаюсь сделать это упражнение в руководстве Python:Возврат словарных ключей и значения в алфавитном порядке

Напишите программу, которая считывает строку в командной строке и возвращает таблицы букв алфавита в алфавитном порядке, который происходит в строке вместе с количеством раз, которое имеет каждая буква . Случай следует игнорировать. Образец запуска программы будет выглядеть так:

$ python letter_counts.py "ThiS is String with Upper and lower case Letters." 
a 2 
c 1 
d 1 
e 5 
g 1 
h 2 
i 4 
l 2 
n 2 
o 1 
p 2 
r 4 
s 5 
t 5 
u 1 
w 2 
$ 

Я уже написал функцию для подсчета букв и хранить их в словаре наряду с соответствующими значениями:

def count_all(text): 
    text = text.lower() 
    counts = {} 
    for char in text: 
     if char not in counts: 
      counts.setdefault(char,1) 
     else: 
      counts[char] = counts[char] + 1 
    print(counts) 

, но мне стыдно сказать, что я полностью ошеломлен тем, как вы можете даже заказывать элементы в типе сопоставления, используя какие-либо правила. Должен ли я преобразовать их в список? Должен ли я использовать ord() в любой точке?

EDIT: Основываясь на ответах, которые я получил, мне удалось заставить функцию распечатать элементы в алфавитном порядке, не используя какие-либо методы, которые я еще не полностью понял. Вот что:

def count_all(text): 
    text = text.lower() 
    counts = {} 
    for char in text: 
     if char not in counts: 
      counts.setdefault(char,1) 
     else: 
      counts[char] = counts[char] + 1 
    counts = sorted(counts.items()) 
    for i in counts: 
     print(i[0],' ',i[1]) 

count_all('banana') 

Это хорошее решение? как это может быть улучшено?

+2

try 'sorted (counts.items())'. Связано: 'collections.Counter' делает то, что вы хотите уже – JBernardo

ответ

1

Добавить return заявления в функции count_all вернуть Словарь

def count_all(text): 
    ... 
    return counts 

Затем вы можете использовать встроенную функцию sorted и for цикла:

for e in sorted(count_all("ThiS is String with Upper and lower case Letters").items()): 
    print e[0], e[1] 

Обратите внимание, что some_dict.items() метод возвращает пары tuple s вида (key, value).

Кроме того, поскольку это похоже, что вы не хотите считать "." или пробелы, вы можете использовать:

text = "".join(text.strip(".").split()).lower() 
+0

Обратите внимание, что sorted создает список пар значений ключа. Если вы хотите избежать создания списка значений ключа, вы можете сделать это, итерации над 'string.lowercase'. –

0

Предположим, у вас есть данные в словаре:

txt='''\ 
a 2 
c 1 
d 1 
e 5 
g 1 
h 2 
i 4 
l 2 
n 2 
o 1 
p 2 
r 4 
s 5 
t 5 
u 1 
w 2''' 

d=dict([tuple(e.split()) for e in txt.splitlines()]) 
# d={'p': '2', 'r': '4', 's': '5', 't': '5', 'u': '1', 'w': '2', 'a': '2', 'c': '1', 'd': '1', 'e': '5', 'g': '1', 'h': '2', 'i': '4', 'l': '2', 'n': '2', 'o': '1'} 

Если вы хотите напечатать d только с помощью ключа, вы можете просто использовать sorted непосредственно:

print(sorted(d.items())) 

Теперь, если вы хотите, чтобы отсортировать а) первой по частоте буквы, то б) письма:

li=sorted(d.items(), key=lambda t: (t[1], -ord(t[0])), reverse=True) 
# li= 
('e', '5') 
('s', '5') 
('t', '5') 
('i', '4') 
('r', '4') 
('a', '2') 
('h', '2') 
('l', '2') 
('n', '2') 
('p', '2') 
('w', '2') 
('c', '1') 
('d', '1') 
('g', '1') 
('o', '1') 
('u', '1') 
0
s = 'ThiS is String with Upper and lower case Letters.' 

# Or see Python's Counter class: counts = Counter(s.lower()) 
counts = {} 
for c in s.lower(): 
    counts[c] = counts.get(c, 0) + 1 

for c, n in sorted(counts.items()): 
    print(c, n) 
0

отсортирован работы, и является довольно популярным на StackOverflow, но совсем немного медленнее, чем-то (как 2.x и 3.x) и имеет тенденцию давать слишком длинные строки кода.

Итак:

items = list(counts.items()) 
items.sort() 
for key, value in items: 
    # do something with key and value 

выше должны работать как на 2.x и 3.x, хотя это не тестировалась.

Как уже упоминалось, collection.Counter() ближе к тому, что вы хотите сделать в этом случае, и доступен как в версиях 2.x, так и 3.x.

Если вы занимались сортировкой внутри цикла, то вместо словаря (хеш-таблицы) вы хотели бы использовать словарное дерево вместо словаря. Но это не так, поэтому использование словаря и одного рода более эффективно.

Если вы разбирали в цикле, вот несколько словаря, как дерев в Python (2.x и 3.x при поддержке, в том числе и Jython PyPy), которые сохраняют свои данные в замочном порядке: http://stromberg.dnsalias.org/~dstromberg/datastructures/ http://stromberg.dnsalias.org/~strombrg/python-tree-and-heap-comparison/2014-01/

Существует также то, что известно как collection.OrderedDict(), но оно хранит данные в порядке ввода, а не в порядке.

HTH

Смежные вопросы