2014-12-23 3 views
-4

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

Edern 38 
Pellam 34 
Ban 32 
Lionel 30 
Geraint 30 
Brangaine 28 
Erec 28 
Guiron 28 
Fisher 28 
Elyan 28 
Segwarides 26 

В этом случае вывод будет:

Edern 38 
Pellam 34 
Ban 32 
Geraint 30 
Lionel 30 
Brangaine 28 
Elyan 28 
Erec 28 
Fisher 28 
Guiron 28 
Segwarides 26 

я хочу, чтобы отсортировать ключи с одинаковыми значениями в алфавитном порядке, но не трогайте элементы с разными ключами? Как это реализовать?

+1

Пожалуйста укажите пример желаемого результата. –

+1

Как сортировать словарь? По определению словари являются несортируемыми. – RPGillespie

+0

В словаре ключ всегда сортируется – aerokite

ответ

3

Если вы представляете свои пары номеров имен в виде списка двухпозиционных кортежей, вы можете использовать groupby для объединения одинаковых номеров вместе и сортировать каждую группу самостоятельно, не затрагивая групповой порядок.

import itertools 

items = [ 
    ("Edern", 38), 
    ("Pellam", 34), 
    ("Ban", 32), 
    ("Lionel", 30), 
    ("Geraint", 30), 
    ("Brangaine", 28), 
    ("Erec", 28), 
    ("Guiron", 28), 
    ("Fisher", 28), 
    ("Elyan", 28), 
    ("Segwarides", 26) 
] 

result = [] 
for k,v in itertools.groupby(items, lambda item: item[1]): 
    result.extend(sorted(v)) 

print result 

Результат:

[ 
('Edern', 38), 
('Pellam', 34), 
('Ban', 32), 
('Geraint', 30), 
('Lionel', 30), 
('Brangaine', 28), 
('Elyan', 28), 
('Erec', 28), 
('Fisher', 28), 
('Guiron', 28), 
('Segwarides', 26) 
] 

... И если вам действительно нужны эти элементы в виде Словаре, вы можете сделать OrderedDict из них, например, так:

from collections import OrderedDict 
d = OrderedDict(result) 
+0

примечание стиля: некоторые пользователи могут предпочесть «импорт» operator' и использовать 'operator.itemgetter (items, 1)' как второй аргумент 'groupby'. Вместо этого я построил лямбду, просто потому, что мне нравилось поддерживать мой ряд «импортных» заявлений низким. – Kevin

0

Это кажется, что вы хотите сортировать, уменьшая числовое значение. Так что это должно работать для вас:

d = {'Edern':38, 
    'Pellam':34, 
    'Ban':32, 
    'Lionel':30, 
    'Geraint':30, 
    'Brangaine':28, 
    'Erec':28, 
    'Guiron':28, 
    'Fisher':28, 
    'Elyan':28, 
    'Segwarides':26} 

# build a dictionary that maps the numbers to all the keys that have that value 
scored = {} 
for k,v in d.items(): 
    if v not in scored: 
     scored[v] = [] 
    scored[v].append(k) 

for k in sorted(scored, reverse=True): 
    for v in sorted(scored[k]): 
     print("{} {}".format(v, k)) 

Выход:

Edern 38 
Pellam 34 
Ban 32 
Geraint 30 
Lionel 30 
Brangaine 28 
Elyan 28 
Erec 28 
Fisher 28 
Guiron 28 
Segwarides 26 

Конечно, есть один вкладыш для этого:

for k,v in sorted(list(d.items()), key=lambda t: (-1*t[1], t[0])): 
    print("{} {}".format(k, v)) 

Выход:

Edern 38 
Pellam 34 
Ban 32 
Geraint 30 
Lionel 30 
Brangaine 28 
Elyan 28 
Erec 28 
Fisher 28 
Guiron 28 
Segwarides 26 
Смежные вопросы