Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 10, 2007 21:08:52

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

Как отсортировать словарь по неуникальным значениям?

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)

Офлайн

#2 Дек. 10, 2007 23:03:16

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Как отсортировать словарь по неуникальным значениям?

словари не сортируются.



Офлайн

#3 Дек. 11, 2007 02:40:54

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Как отсортировать словарь по неуникальным значениям?

Хм. Пожалуй для такой задачи, данная структура не очень эффективна.
Но в виде исключения (т.е. работать будет не шибко быстро, но будет):

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)

Офлайн

#4 Дек. 11, 2007 06:24:44

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Как отсортировать словарь по неуникальным значениям?

Кстати, если делать 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.
”“”



Офлайн

#5 Дек. 11, 2007 08:47:55

Все ники заняты
От:
Зарегистрирован: 2007-02-18
Сообщения: 156
Репутация: +  1  -
Профиль   Отправить e-mail  

Как отсортировать словарь по неуникальным значениям?

Спасибо, кажись, работает :).



Офлайн

#6 Дек. 20, 2010 16:55:44

bulya911
От:
Зарегистрирован: 2010-08-26
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Как отсортировать словарь по неуникальным значениям?

А как отсортировать в обратном порядке?



Офлайн

#7 Дек. 20, 2010 19:09:42

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Как отсортировать словарь по неуникальным значениям?

>>> 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')]

Офлайн

#8 Дек. 20, 2010 21:52:42

bulya911
От:
Зарегистрирован: 2010-08-26
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Как отсортировать словарь по неуникальным значениям?

сенкс за ответ, я уже сделал иначе: перед cmp поставил “-”



Офлайн

#9 Дек. 21, 2010 19:01:51

bulya911
От:
Зарегистрирован: 2010-08-26
Сообщения: 28
Репутация: +  0  -
Профиль   Отправить e-mail  

Как отсортировать словарь по неуникальным значениям?

еще вопросик:
есть словарь {3499L: ‘', 2408L: ’asdasd', 1235L: ‘grgsdf’}
как отсортировать по значениям? то есть в алфавитном порядке?



Офлайн

#10 Дек. 21, 2010 20:01:13

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Как отсортировать словарь по неуникальным значениям?

bulya911
еще вопросик:
есть словарь {3499L: ‘', 2408L: ’asdasd', 1235L: ‘grgsdf’}
как отсортировать по значениям? то есть в алфавитном порядке?
читай тему сначала

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version