2013-12-09 2 views
0

У меня есть словарь:Сортировка словаря по длине значения

d = {'a':[1,3], 'b':[3,4,5,6], 'c':[1], 'd':[1,2,3] } 

Я хочу, чтобы сделать меньше, новый словарь с двумя верхними пар ключ: значение, отсортированный по len списков в стоимости , Таким образом, в этом случае, я хочу:

newd = {'b':[3,4,5,6], 'd':[1,2,3] } 

Я попытался this answer, но получил эту ошибку:

NameError: global name 'd' is not defined 
+0

Пожалуйста, сообщите, как именно вы пытались реализовать другое решение. Он выглядит * точно * как то, что вы хотели, поэтому вы, должно быть, допустили ошибку, когда вы адаптировали код. Когда я использую другой код, он отлично работает для меня. –

+0

@FelixKling Я не адаптировал код. Я просто копирую и вставляю из ответа. – mchangun

+2

Ну, я сделал так же хорошо, и это работает для меня. См. Http://codepad.org/RyobPnHY. Скопировали ли вы '>>>' также случайно? Как бы то ни было, этот вопрос является всего лишь дубликатом. Мы не можем помочь вам научиться правильно копировать и вставлять код. –

ответ

4

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

sorted_items = sorted(d.items(), key = lambda item : len(item[1])) 
newd = dict(sorted_items[-2:]) 
+1

Я бы сказал, что передача 'reverse = true' в' sorted' более результативна, чем после вспять весь список. Вероятно, это также полезно, если вы объясните, что означает «[- - 1]». –

+0

Или отрежьте последние два 'dict (sorted_items [-2:])' –

+0

@Felix King: Возможно, это так. Скорректированный код, чтобы просто срезать последние два в любом случае. – oadams

2

Похоже, работа для heapq:

big_items = heapq.nlargest(2, d.items(), key=lambda x: len(x[1])) 
newd = dict(big_items) 

Преимущество heapq над sorted заключается в том, что это обеспечивает временную сложность O (N), тогда как sorted даст сложность времени O (NlogN). Для маленьких диктонов это, вероятно, не имеет большого значения. sorted может быть даже быстрее из-за более оптимизированной реализации, но для больших диктофонов это может фактически приобрести вам значительное ускорение.


(на python2.x, вы можете использовать d.iteritems() вместо d.items())

+0

+1 хотя 'sorted', вероятно, _faster_ большую часть времени. –

+0

@gnibbler - Это зависит от размера словаря. – mgilson

+0

Я знаю о большом-O, но в этом случае константа довольно велика, поэтому требуется время, прежде чем журнал обгонит ее. –

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