Форум сайта python.su
ActivePython 2.5, Windows XP.
Есть словарь, который хотелось бы отсортировать по значениям (неуникальным).
Функция sorted сортирует вроде по ключам?
Попытка инвертировать словарь перед сортировкой (val <=> key) к успеху не приводит, т.к. значения не уникальны, и часть данных из-за этого теряется:
# -*- coding: utf-8 -*-
import codecs, sys
sys.stdout = codecs.getwriter('cp866')(sys.stdout, errors='replace')
# =================
Employees = {u'Вася' : u'24', u'Анна Ивановна' : u'24', u'Мария' : u'17'}
revEmployees = dict([(val, key) for (key, val) in Employees.items()])
for key, value in sorted(revEmployees.items()):
print key, value
Отредактировано (Дек. 10, 2007 21:10:04)
Офлайн
словари не сортируются.
Офлайн
Хм. Пожалуй для такой задачи, данная структура не очень эффективна.
Но в виде исключения (т.е. работать будет не шибко быстро, но будет):
Employees = {u'Vasja': u'24', u'Ann Ivanovna' : u'24', u'Marija' : u'17'}
sorted_keys = sorted(Employees, lambda x, y: cmp(Employees[x], Employees[y]))
#sorted_keys - ключи словаря, отсортированные по значениям (звучит дико, однако это так =)
#напечатаем их для проверки:
for i in sorted_keys:
print i, Employees[i]
Employees = {u'Vasja': u'24', u'Ann Ivanovna' : u'24', u'Marija' : u'17'}
sorted_keys = sorted(Employees, lambda x, y: cmp(int(Employees[x]), int(Employees[y])))
for i in sorted_keys:
print i, Employees[i]
Отредактировано (Дек. 11, 2007 02:42:11)
Офлайн
Кстати, если делать sorted(Employees, key=lambda x: int(Employees)) оно лучше будет…
http://docs.python.org/lib/built-in-funcs.html:
“”“
In general, the key and reverse conversion processes are much faster than specifying an equivalent cmp function. This is because cmp is called multiple times for each list element while key and reverse touch each element only once.
”“”
Офлайн
Спасибо, кажись, работает :).
Офлайн
А как отсортировать в обратном порядке?
Офлайн
>>> Employees = {u'Vasja': u'24', u'Ann Ivanovna' : u'24', u'Marija' : u'17'}
>>> sorted(Employees.items(),key=lambda x:x[1],reverse=True)
[(u'Vasja', u'24'), (u'Ann Ivanovna', u'24'), (u'Marija', u'17')]
Офлайн
сенкс за ответ, я уже сделал иначе: перед cmp поставил “-”
Офлайн
еще вопросик:
есть словарь {3499L: ‘', 2408L: ’asdasd', 1235L: ‘grgsdf’}
как отсортировать по значениям? то есть в алфавитном порядке?
Офлайн
bulya911читай тему сначала
еще вопросик:
есть словарь {3499L: ‘', 2408L: ’asdasd', 1235L: ‘grgsdf’}
как отсортировать по значениям? то есть в алфавитном порядке?
Офлайн