#python #frequency #histogram
#python #частота #гистограмма
Вопрос:
for x in letters:
frequency[x] =1
for x in frequency:
print x,frequency[x],frequency[x]/float(n)
Извините, но я довольно новичок в программировании и во всем остальном, и я пытаюсь отсортировать выходные данные от наибольшего значения frequency[x]/float(n)
до наименьшего значения. Есть ли какой-либо способ отсортировать его только с помощью команды печати?
Большое спасибо!
Комментарии:
1. Похоже, что вы используете какую-то библиотеку (hist / grid / xlabel / etc), Не встроенную в python; вы, вероятно, используете что-то вроде scipy; это, вероятно, стоит упомянуть в вопросе.
2. @AlexeyMK: Это
matplotlib
, и да, в примере катастрофически не хватает контекста. @PythonAlex: это очень отличается от вашего первоначального вопроса. Не могли бы вы задать это как отдельный вопрос (и, возможно, удалить эту часть из этого поста)?
Ответ №1:
Для ключей:
sorted(frequency, key=lambda x: frequency[x], reverse=True)
Комментарии:
1. Вам вообще нужно делить на float (n) при сравнении? (поскольку это одинаково для всех значений) Я не вижу никакого способа, которым масштабирование повлияло бы на результаты сортировки.
2. @Bwmat: Количество населения, как правило, не отрицательное.
3. я имел в виду тот факт, что n никогда не был определен в самом вопросе. Мы просто предполагаем, что n = len (буквы) или какой-либо другой список.
4. Вероятно, это не проблема, но если
n
потенциально может быть меньше нуля, то было бы более эффективно использоватьreverse=float(n) > 0
, чем делить каждое значение наn
.
Ответ №2:
Выполните
for x in sorted(frequency, key=lambda y: frequency[y]/float(n), reverse=True):
print x,frequency[x],frequency[x]/float(n)
Комментарии:
1. При использовании
sorted()
вывод включает только элементы внутри массива. Возможно ли напечатать другие возможные элементы x, которых нет в предоставленном массиве?2. Мне понадобится пример того, что вы имеете в виду.
3. Ну, я пытаюсь создать программу для частотного анализа… Сначала он запрашивает импортировать файл, содержащий только английские символы. Затем он преобразует эти символы в массив, где a соответствует 0, а b — 1 и так далее … затем я просто хочу посчитать количество встреч буквы x разделенным и распечатать это букву и частоту. Однако, когда я прикрепляю
sorted()
, программа отклоняет любые символы, которых нет в файле, и выводит только символы внутри файла…4. Пример: ABCFFGGHHH выводом было бы A 1 0.1, B 1 0.1, C 1 0.1, F 2 0.2, G 2 0.2, H 3 0.3, это исключает все остальные символы алфавита… например, я хотел бы, чтобы программа печатала D 0 0.0, I 0 0.0 … от etc до Z 0 0.0, а также эти символы в файле…
5. @PythonAlex: вы, вероятно, хотите инициализировать
frequency = dict([(l, 0) for l in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'])
или что-то подобное в начале вашей программы. Вы также могли бы просто перебрать весь алфавит в своем цикле и использоватьfrequency.get(x)
orif x in frequency
, чтобы получить, какие значения там есть. (Примечание: я использую настоящие буквы, а не цифры, в качестве ключей dict, но при необходимости вы можете перевести)
Ответ №3:
Это должно сработать:
freqs = sorted([frequency[x]/float(n) for x in frequency], reverse=True)
Если вы хотите, чтобы это больше походило на инструкцию print, которую вы использовали выше, попробуйте это:
for (fxn, fx, x) in sorted([(frequency[x]/float(n), frequency[x], x) for x in frequency], reverse=True):
print x, fx, fxn
Ответ №4:
Ответы вспыхивают прямо перед моими глазами! Да, используйте sorted
. Подробнее здесь.