Найти - Пользователи
Полная версия: Как отсортировать словарь по неуникальным значениям?
Начало » Python для новичков » Как отсортировать словарь по неуникальным значениям?
1 2
Все ники заняты
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
Есть ли выход?
bialix
словари не сортируются.
shiza
Хм. Пожалуй для такой задачи, данная структура не очень эффективна.
Но в виде исключения (т.е. работать будет не шибко быстро, но будет):
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]
j2a
Кстати, если делать 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.
”“”
Все ники заняты
Спасибо, кажись, работает :).
bulya911
А как отсортировать в обратном порядке?
o7412369815963
>>> 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')]
bulya911
сенкс за ответ, я уже сделал иначе: перед cmp поставил “-”
bulya911
еще вопросик:
есть словарь {3499L: ‘', 2408L: ’asdasd', 1235L: ‘grgsdf’}
как отсортировать по значениям? то есть в алфавитном порядке?
o7412369815963
bulya911
еще вопросик:
есть словарь {3499L: ‘', 2408L: ’asdasd', 1235L: ‘grgsdf’}
как отсортировать по значениям? то есть в алфавитном порядке?
читай тему сначала
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB