findimagedupes довольно хорош. Можно работать "findimagedupes-v изображения цифрового отпечатка", чтобы позволить ему распечатать "проницательный хеш", например.
Вы можете отсортировать ключи по своему усмотрению, разделив их на '.' а затем преобразование каждого из компонентов в целое число, например:
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)]
Функции сортировки 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 ()
, хотя. См. Пример ответа Яна Клелланда .
Я бы поискал по «сортировка словаря Python» и посмотрел на ответы. Я бы также прочитал PEP-265 . Функция sorted ()
- это то, что вам нужно.
В качестве дополнения к ответу Яна Клелланда вызов map ()
можно заменить на понимание списка ... если вы предпочитаете этот стиль. Он может также быть более эффективным (хотя я подозреваю, что в данном случае это незначительно).
sorted (mydict.keys (), key = lambda a: [int (i) for i in a.split ( '.')])
Для развлечения и полезности (в основном для гугления):
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().