Сортировка элементов в Python по определенному правилу - PullRequest
4 голосов
/ 28 ноября 2010

скажи, что у меня есть dict: d = {'Abc': 5, 'Jack': 4, 'amy': 9, 'Tom': 0, 'abc': 5}

Если я хочу написать такую ​​функцию, что если я передам эту функцию встроенной функции сортировки, например. list (d) .sort (функция), функция сортировки сортирует список по значениям, любые из которых имеют одинаковые значения, сортируют их по ключам (в алфавитном порядке). Таким образом, в этом случае 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 (range_items), я должен получить отсортированный список обратно

Заранее спасибо

Изменение спецификации (Другой вопрос): если у меня есть имя пользователя в твиттере, оно будет в следующем формате:

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 составляет, по крайней мере, один б / к, по крайней мере, один пользователь, который следует за MiniT.

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

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

Ответы [ 2 ]

3 голосов
/ 28 ноября 2010
[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()))
1 голос
/ 28 ноября 2010

Вы не можете достичь этого с помощью list (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 имеет стабильный алгоритм сортировки, порядок значений сохраняется для идентичных ключей.

Правка: подход Игнасио Васкеса-Абрара похож, но более элегантен, поскольку список нужно отсортировать только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...