2015-04-10 2 views
3

Я почти закончил свою проблему сортировки, много часов занимался серфингом в Интернете. Я наткнулся на чрезвычайно полезное руководство по сортировке словарей в 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». Любая помощь была бы очень обязательна.

ответ

6

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

(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" считается> .

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

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

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

+0

Большое вам спасибо, это сработало мгновенно. – ryan2405

+0

@ ryan2405 не беспокоится, как вы создаете 'names2' и т. Д.?? –

+0

Просто используя первый раздел кода (очевидно, обмениваясь 1 на 2). Требования к работе не требуют повышения эффективности, и мой учитель продолжает выражать этот факт. Я пробовал пока петли безрезультатно. Весь мой код мог бы сделать серьезный взлет, чтобы повысить эффективность, но он выполняет свою заданную задачу, и я, к сожалению, привязан к времени. – ryan2405

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