ОБНОВЛЕНИЕ: Сортировка списка из a для вывода с наивысшего на наименьший в python

#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) or if 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 . Подробнее здесь.