Могу ли я отсортировать текст по числовому значению в Python? - PullRequest
11 голосов
/ 08 октября 2009

У меня есть dict в Python с ключами следующей формы:

mydict = {'0'     : 10,
          '1'     : 23,
          '2.0'   : 321,
          '2.1'   : 3231,
          '3'     : 3,
          '4.0.0' : 1,
          '4.0.1' : 10,
          '5'     : 11,
          # ... etc
          '10'    : 32,
          '11.0'  : 3,
          '11.1'  : 243,
          '12.0'  : 3,
          '12.1.0': 1,
          '12.1.1': 2,
          }

Некоторые индексы не имеют под-значений, некоторые имеют один уровень под-значений, а некоторые - два. Если бы у меня был только один подуровень, я мог бы рассматривать их все как числа и сортировать их численно. Второй подуровень заставляет меня обрабатывать их все как строки. Однако, если я отсортирую их как строки, у меня будет 10 после 1 и 20 после 2.

Как правильно отсортировать индексы?

Примечание: Что я действительно хочу сделать, это распечатать диктовку, отсортированную по индексу. Если есть лучший способ сделать это, чем сортировать его, это нормально для меня.

Ответы [ 6 ]

19 голосов
/ 08 октября 2009

Вы можете отсортировать ключи по своему усмотрению, разделив их на '.' а затем преобразовать каждый из компонентов в целое число, например:

sorted(mydict.keys(), key=lambda a:map(int,a.split('.')))

, который возвращает это:

['0',
 '1',
 '2.0',
 '2.1',
 '3',
 '4.0.0',
 '4.0.1',
 '5',
 '10',
 '11.0',
 '11.1',
 '12.0',
 '12.1.0',
 '12.1.1']

Вы можете перебирать этот список ключей и извлекать значения из своего словаря по мере необходимости.

Вы также можете отсортировать результат mydict.items (), очень похоже:

sorted(mydict.items(), key=lambda a:map(int,a[0].split('.')))

Это дает вам отсортированный список пар (ключ, значение), например:

[('0', 10),
 ('1', 23),
 ('2.0', 321),
 ('2.1', 3231),
 ('3', 3),
 # ...
 ('12.1.1', 2)]
2 голосов
/ 08 октября 2009

В качестве дополнения к ответу Яна Келланда , вызов map() можно заменить на понимание списка ... если вы предпочитаете этот стиль. Это может также быть более эффективным (хотя я подозреваю, что это незначительно в этом случае).

sorted(mydict.keys(), key=lambda a: [int(i) for i in a.split('.')])

2 голосов
/ 08 октября 2009

Функции сортировки Python могут принимать пользовательскую функцию сравнения, поэтому вам просто нужно определить функцию, которая сравнивает клавиши так, как вам нравится:

def version_cmp(a, b):
  '''These keys just look like version numbers to me....'''
  ai = map(int, a.split('.'))
  bi = map(int, b.split('.'))
  return cmp(ai, bi)

for k in sorted(mydict.keys(), version_cmp):
  print k, mydict[k]

В этом случае вам лучше использовать параметр key для sorted(). См. Ian Clelland в качестве примера для этого.

1 голос
/ 28 августа 2010

Для удовольствия и полезности (в основном, для гуглплей):

f = lambda i: [int(j) if re.match(r"[0-9]+", j) else j for j in re.findall(r"([0-9]+|[^0-9]+)", i)]
cmpg = lambda x, y: cmp(f(x), f(y))

использовать как sorted(list, cmp=cmpg). Кроме того, регулярные выражения могут быть предварительно скомпилированы (редко требуется, хотя, на самом деле, с кэшированием модуля re). Кроме того, его можно (легко) изменить, например, включить отрицательные значения (возможно, добавьте -? к num regex) и / или использовать значения с плавающей запятой.

Это может быть не очень эффективно, но даже при этом это весьма полезно.

И, хм, его также можно использовать в качестве ключа = для sorted ().

0 голосов
/ 18 февраля 2011

На сайте python есть хороший HOWTO для сортировки: http://wiki.python.org/moin/HowTo/Sorting. Это хорошее введение в сортировку и обсуждение различных методов для адаптации результата сортировки к вашим потребностям.

0 голосов
/ 08 октября 2009

Я бы сделал поиск по "сортировка словаря питона" и посмотрел бы ответы. Я бы тоже прочитал PEP-265 . Функция sorted() - это то, что вы ищете.

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