2016-10-26 4 views
-2

У меня есть вопрос, похожий на тот, который я спросил на прошлой неделе: "Sorting dict items by key, beyond alphanumeric sorting"Сортировки Dict элементы целочисленного ключом, специальная функция

Проблема заключается в тождественной, но теперь ключи от моей Словаре просто целые числа:

>>>lis_nodiz = list(nodiz.items()) #list of dict items as tuples 
[(2, 316), 
(3, 66), 
(4, 37), 
(5, 15), 
(6, 10), 
(7, 4), 
(8, 3), 
(9, 1), 
(10, 2), 
(11, 1), 
(12, 1), 
(45, 1), 
(109, 1), 
(16, 1), 
(126, 1)] 

Как бы догадку я ищу для этого упорядоченного списка кортежей:

[(2, 316), 
(3, 66), 
(4, 37), 
(5, 15), 
(6, 10), 
(7, 4), 
(8, 3), 
(9, 1), 
(10, 2), 
(11, 1), 
(12, 1), 
(16, 1), 
(45, 1), 
(109, 1), 
(126, 1)] 

Я попытался повторно использовать «key_func» Padraic Cunn Инги предложила мне, к сожалению, эта функцию, кажется, работает только с ключами Dict типа строки:

def key_func(x): 
"""'a0p12' -> (0, 12)""" 
return tuple(int("".join(v)) for k,v in groupby(x[0], key=str.isdigit) if k) 

>>>lis_nodiz_od = sorted(nodiz.items(), key=key_func) 
TypeError: expected string or buffer 

Как изменить функцию, или как я могу сделать по-другому, чтобы получить свою цель? Я был бы очень признателен, если кто-нибудь объяснит, как работает «key_func», и правильные изменения, чтобы сделать его работу с целыми; таким образом, я буду больше понимать о программировании на Python, надеюсь, и не только решить мою проблему сегодня! Спасибо вам всем!

+0

В защиту для оставать этого вопроса, я знаю, что этот вопрос был задан до; в любом случае мне кажется, что часть вопроса о key_func оригинальна и не задана раньше. Так что в окончательном вопросе мой вопрос не был полностью задан и ответил раньше ... до вас! –

ответ

2

Вызов sorted() или list.sort() как:

# sorted(): Creates new list with sorted order 
>>> sorted(lis_nodiz) 
[(2, 316), (3, 66), (4, 37), (5, 15), (6, 10), (7, 4), (8, 3), (9, 1), (10, 2), (11, 1), (12, 1), (16, 1), (45, 1), (109, 1), (126, 1)] 

# list.sort(): sort the existing list 
>>> lis_nodiz.sort() 
>>> lis_nodiz 
[(2, 316), (3, 66), (4, 37), (5, 15), (6, 10), (7, 4), (8, 3), (9, 1), (10, 2), (11, 1), (12, 1), (16, 1), (45, 1), (109, 1), (126, 1)] 

где lis_nodiz является список кортежей как указано в вопросе.

Примечание: здесь не нужно указывать key. По умолчанию лексикографическая сортировка по 0-му индексу; при одинаковом значении, сортируется по 1-му индексу.

+2

Обратите внимание, что ключевая функция необходима, только если вы хотите, чтобы сортировка была стабильной на втором элементе; Кортежи уже сортируют лексикографически по своим элементам слева направо. Кроме того, 'operator.itemgetter (0)' должен быть более эффективным, чем пользовательская функция. – chepner

+0

@chepner: Спасибо за ценную информацию –

+1

Хорошо, спасибо вам за ваши объяснения и ответы! –

0

Не нужно сортировать с лямбдой на первом ключе: это по умолчанию для кортежа.

>>> sorted(x) 
[(2, 316), (3, 66), (4, 37), (5, 15), (6, 10), (7, 4), (8, 3), (9, 1), (10, 2), (11, 1), (12, 1), (16, 1), (45, 1), (109, 1), (126, 1)] 

Он будет автоматически сортировать по первому элементу, и если они равны сортируют по второму элементу, и т.д.

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