Я пытаюсь подсчитать все буквы в txt-файле, а затем отображать их в порядке убывания

Как говорится в названии:

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

def frequencies(filename): infile=open(filename, 'r') wordcount={} content = infile.read() infile.close() counter = {} invalid = "''`,.?!:;-_\n—' '" for word in content: word = content.lower() for letter in word: if letter not in invalid: if letter not in counter: counter[letter] = content.count(letter) print('{:8} appears {} times.'.format(letter, counter[letter])) 

Любая помощь будет принята с благодарностью.

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

Сортировка в порядке убывания довольно просто, используя встроенную sorted (вам нужно установить reverse действие)!

Однако python – это батареи, и уже есть Counter . Таким образом, это может быть так же просто:

 from collections import Counter from operator import itemgetter def frequencies(filename): # Sets are especially optimized for fast lookups so this will be # a perfect fit for the invalid characters. invalid = set("''`,.?!:;-_\n—' '") # Using open in a with block makes sure the file is closed afterwards. with open(filename, 'r') as infile: # The "char for char ...." is a conditional generator expression # that feeds all characters to the counter that are not invalid. counter = Counter(char for char in infile.read().lower() if char not in invalid) # If you want to display the values: for char, charcount in sorted(counter.items(), key=itemgetter(1), reverse=True): print(char, charcount) 

Счетчик уже имеет метод most_common но вы хотите отображать все символы и количество, поэтому в этом случае он не подходит. Однако, если вы хотите узнать только x самых общих счетчиков, тогда это будет подходящим.

Словари – это неупорядоченные структуры данных. Кроме того, если вы хотите подсчитать некоторые элементы в наборе данных, вам лучше использовать collections.Counter() который для этой цели более оптимизирован и pythonic.

Затем вы можете просто использовать Counter.most_common(N) , чтобы печатать большинство N общих элементов в объекте Counter.

Также в отношении открытия файлов вы можете просто использовать оператор with который автоматически закрывает файл в конце блока. И лучше не печатать конечный результат внутри вашей функции, вы можете сделать свою функцию генератором, уступив намеченные строки, а затем распечатав их, когда захотите.

 from collections import Counter def frequencies(filename, top_n): with open(filename) as infile: content = infile.read() invalid = "''`,.?!:;-_\n—' '" counter = Counter(filter(lambda x: not invalid.__contains__(x), content)) for letter, count in counter.most_common(top_n): yield '{:8} appears {} times.'.format(letter, count) 

Затем используйте цикл for для перебора функции генератора:

 for line in frequencies(filename, 100): print(line) 

Вам не нужно перебирать слова, а затем буквы в них. Когда вы перебираете строку (например, content ), у вас уже будут отдельные символы (длина 1 строка). Затем вы хотите подождать до окончания цикла подсчета перед показом вывода. После подсчета вы можете вручную отсортировать:

 for letter, count in sorted(counter.items(), key=lambda x: x[1], reverse=True): # do stuff 

Однако лучше использовать collections.Counter :

 from collections import Counter content = filter(lambda x: x not in invalid, content) c = Counter(content) for letter, count in c.most_common(): # descending order of counts print('{:8} appears {} times.'.format(letter, number)) # for letter, number in c.most_common(n): # limit to n most # print('{:8} appears {} times.'.format(letter, count)) 

Вы можете сортировать свой словарь во время печати с помощью sorted метода:

 lettercount = {} invalid = "''`,.?!:;-_\n—' '" infile = open('text.file') for c in infile.read().lower(): if c not in invalid: lettercount[c] = lettercount.setdefault(c,0) + 1 for letter in sorted(lettercount): print("{} appears {} times".format(letter,lettercount[letter])) 

Rmq: Я использовал метод изменения setdefault чтобы установить значение по умолчанию 0, когда мы встречаем письмо в первый раз