Сортировка десятичных знаков в словаре

Я почти закончил свою проблему с сортировкой, много часов просматривая веб-страницы, я наткнулся на чрезвычайно полезное руководство по сортировке словарей в Python, но проблема, которая возникает снова, когда я пытаюсь сортировать, заключается в том, что мои данные, требующие сортировки, тип данных с плавающей точкой.

Пример того, как я создаю переменные 'names'x' 'и' avmph'x ''

file1=open("1.txt",'r')
line1=file1.readlines()
names1=line1[0].rstrip('\n')
avmph1=line1[3].rstrip('\n')

mydict={names1:avmph1,
    names2:avmph2,
    names3:avmph3,
    names4:avmph4,
    names5:avmph5,
    names6:avmph6,
    names7:avmph7,
    names8:avmph8,
    names9:avmph9,
    names10:avmph10}

for key, value in sorted(mydict.items(),key=lambda item:(item[1],item[0])):
    print ("%s : %s" % (key,value))

Результат, который я получаю, выглядит следующим образом:

1987dodd : 10
3219guy : 11.6
2198adams : 12.2
8765james : 13.2
4321jones : 6.3
5432kane : 6.3
9876smith : 6.5
8754smith : 8.7
7654max : 9
6543dunne : 9.5
#seems to sort values that are greater than 10 (2 digits before decimal) separately 

Я не уверен, как отредактировать свой существующий код, так как.sort (float) работал только на моем "avmph", этот метод должен позволять мне возвращать "имена" и "avmph". Любая помощь будет очень благодарна.

1 ответ

Решение

Вы должны бросить, чтобы плавать:

(float(item[1]),item[0]))

Вы сортируете строки, а не фактическое значение с плавающей точкой:

In [1]: "13.2" < "6.3"
Out[1]: True

In [2]: float("13.2") < float("6.3")
Out[2]: False

Так как ord("6") > ord("1")"6.3" считается> "13.2",

Не совсем уверен, как соотносятся имя и avmph, но если вы на каждой второй строке, вы можете сделать что-то вроде:

with open("1.txt") as f:
    d = {next(f).rstrip():next(f).rstrip() for line in f}

next(f).rstrip() переходит к следующей строке при каждом вызове, поэтому мы используем каждую вторую строку как ключ и значение. with автоматически закроет ваш файл.

Другие вопросы по тегам