Могу я сортировать текст по его числовому значению в Python?

findimagedupes довольно хорош. Можно работать "findimagedupes-v изображения цифрового отпечатка", чтобы позволить ему распечатать "проницательный хеш", например.

11
задан Nathan Fellman 7 October 2009 в 22:13
поделиться

5 ответов

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

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)]
19
ответ дан 3 December 2019 в 04:33
поделиться

Функции сортировки 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 () , хотя. См. Пример ответа Яна Клелланда .

2
ответ дан 3 December 2019 в 04:33
поделиться

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

0
ответ дан 3 December 2019 в 04:33
поделиться

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

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

2
ответ дан 3 December 2019 в 04:33
поделиться

Для развлечения и полезности (в основном для гугления):

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). Кроме того, регулярные выражения могут быть предварительно скомпилированы (хотя на самом деле это редко требуется при кэшировании повторного модуля). И его можно (легко) изменить, например, чтобы включить отрицательные значения (возможно, добавить -? к регулярному выражению num) и/или использовать значения с плавающей запятой.

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

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

1
ответ дан 3 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: