2010-11-27 3 views
2

говорят, что у меня есть dict: d = {'Abc': 5, 'Jack': 4, 'amy': 9, 'Tom': 0, 'abc': 5}Элементы сортировки Python по определенному определенному правилу

Если я хочу написать такую ​​функцию, чтобы, если я передаю эту функцию встроенной функции сортировки, например. list (d) .sort (function), функция сортировки сортирует список на основе значений, любой из них имеет одинаковые значения, сортирует их по их ключам (в алфавитном порядке). Итак, в этом случае d = {'Abc': 5, 'Jack': 4, 'amy': 9, 'Tom': 0, 'abc': 5, 'TAM': 0} возвращает ['amy' , 'Abc', 'ABC', 'Jack', 'ТАМ', 'Том'] функция должна выглядеть примерно так:

def arrange_items(something, thing,**may be a function**): 
     if something < thing: 
       return -1 
     elif something > thing: 
       return 1 
     etc 

, если я называю some_list.sort (arrange_items), я должен получить отсортированный список назад

Спасибо заранее

Модификация спецификации (Другой вопрос): , если у меня есть Dict от имени пользователей Твиттера, то ДИКТ в этом формате:

dict = {'JohnZ':{'name': Jonny Zue,'follow':'MiniT',}, etc} # JohnZ is one of the twitter user. The follow means people that JonhZ follows, in this case it is MiniT. 

Популярность пользователя означает число людей, которые следуют за этим конкретным пользователем, в приведенном выше примере, популярность Minit по меньшей мере, один B/C есть по крайней мере один пользователь, который следуйте за MiniT.

скажите, что у меня есть список имен пользователей twitter, скажем L1 = ['JonhZ', 'MiniT' и т. Д.], И я хочу сортировать L1 на основе популярности пользователей (на первом месте стоит более высокая популярность). dict уже определен в глобальном пространстве имен (мы можем напрямую обращаться к dict). Требование для этой функции сортировки - использовать L1.sort (pass_function) Как написать функцию pass_function, чтобы сортировка автоматически сортировала L1 на основе популярности пользователей.

Спасибо за помощь

ответ

2
[k for k, v in sorted(d.iteritems(), key=lambda x: (-x[1], x[0].lower()))] 

EDIT:

(я отказываюсь использовать название "Dict", поскольку она затеняет встроенную команду, и теневое встроенных команд глупо)

L1.sort(key=lambda x: (-d.get(x, 0), x.lower())) 
+0

говорить что-то «глупо» не полезно. теневые встроенные вложения могут быть опасными и громоздкими для интерпретатора и будущих кодеров. но не "глупый" – franklin 2013-07-06 19:18:10

0

Вы не можете добиться этого с помощью списка (d) .sort (function), потому что вы получите список со словарными клавишами. Вы можете достичь своей цели с альтернативным подходом:

l1 = sorted(d.items(), key=lambda x: (x[1], x[0])) 
l2 = sorted(l1, key=lambda x: x[1], reverse=True) 
result = [x[0] for x in l2] 

Этот подход преобразует словарь в список (ключ, значение) кортежей. Затем l1 сортируется по значениям, а l2 сортируется по ключам. Поскольку python имеет стабильный алгоритм сортировки, порядок значений сохраняется для идентичных ключей.

Редактировать: подход Игнасио Васкеса-Абрара похож, но более изящный, потому что список нужно сортировать только один раз.

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