我在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
。
如何正确排序索引?
注意:我真正想要做的是打印出按索引排序的字典。如果有更好的方法来做它而不是对它进行排序,这对我来说很好。
答案 0 :(得分:18)
您可以按照您想要的方式对键进行排序,方法是将它们拆分为“。”然后将每个组件转换为整数,如下所示:
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)]
答案 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()
。有关此示例,请参阅Ian Clelland的答案。
答案 2 :(得分:2)
作为Ian Clelland's回答的附录,map()
来电可以替换为列表理解...如果你喜欢这种风格。它可能也更有效率(虽然在这种情况下我可以忽略不计)。
sorted(mydict.keys(), key=lambda a: [int(i) for i in a.split('.')])
答案 3 :(得分:1)
为了好玩而且有用(主要用于谷歌搜索):
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)和/或使用浮点值。
它可能效率不高,但即便如此,它也非常有用。
而且,嗯,它也可以用作key = for sorted()。
答案 4 :(得分:0)
我会在"sorting a python dictionary"上搜索并查看答案。我也会给PEP-265一个读数。 sorted()
功能正是您所需要的。
答案 5 :(得分:0)
python网站上有一个很好的排序HOWTO:http://wiki.python.org/moin/HowTo/Sorting。 它对排序做了很好的介绍,并讨论了使排序结果适应您需求的不同技术。