2014-01-03 5 views
3

У меня есть список dicts:Пользовательский вид списка dicts Python

ldicts = [{'name': '120-150'}, {'name': '90-120'}, {'name': '150-180'}, {'name': '>= 180'}, {'name': '<90'}, {'name': 'total'}] 

Я хотел бы, чтобы отсортировать его по значению восходящей, так что результат будет выглядеть так:

sortedldicts = [{'name': 'total'}, {'name': '<90'}, {'name': '90-120'},{'name': '120-150'}, {'name': '150-180'}, {'name': '>= 180'}] 

Обычная сортировка не делает этого трюка:

from operator import itemgetter 
sortedldicts = sorted(ldicts , key=itemgetter('name'), reverse=True) 

Так что я предполагаю, что я должен сделать собственный заказ, может быть? Любые подсказки или помощь будут оценены.

+0

Почему именно отсортировано не работает? –

+0

Это результат: '[{'name': 'total'}, {'name': '> = 180'}, {'name': '<90'}, {'name': '90 -120 '}, {' name ':' 150-180 '}, {' name ':' 120-150 '}] ' – salamey

+1

Я думаю, вы можете просто использовать' sortedldicts = sorted (ldicts, reverse = True) ', вывод верно. – Ray

ответ

7

Извлечение цифр с помощью re.findall:

>>> ldicts = [{'name': '120-150'}, {'name': '90-120'}, {'name': '150-180'}, {'name': '>= 180'}, {'name': '<90'}, {'name': 'total'}] 
>>> 
>>> import re 
>>> sorted(ldicts, key=lambda d: map(int, re.findall(r'\d+', d['name']))) 
[{'name': 'total'}, {'name': '<90'}, {'name': '90-120'}, {'name': '120-150'}, {'name': '150-180'}, {'name': '>= 180'}] 
  • Replace map(int, ...) с list(map(int, ...)), если вы используете Python 3.x.
+0

Как это работает? 'key' возвращает список в этом случае, правильно? Итак, списки сравниваются? – thefourtheye

+0

@thefourtheye, ключевая функция возвращает список int. '[[120, 150], [90, 120], [150, 180], [180], [90], []]'. И элементы используются в качестве ключей сравнения. – falsetru

+0

что это за магия? Я попробовал это с помощью: 'ldicts = [{'name': '120-150'}, {'name': '90 -120 '}, {' name ':' 150-180 '}, {' name ': 'больше или равно 180'}, {'name': 'ниже 90'}, {'name': 'total'}] 'и он работает одинаково. В любом случае, спасибо вам большое. – salamey

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