我可以通过Python中的数值对文本进行排序吗?

时间:2009-10-07 22:13:17

标签: python string sorting

我在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后跟120后跟2

如何正确排序索引?

注意:我真正想要做的是打印出按索引排序的字典。如果有更好的方法来做它而不是对它进行排序,这对我来说很好。

6 个答案:

答案 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。 它对排序做了很好的介绍,并讨论了使排序结果适应您需求的不同技术。