在Python中,我可以按文本的数值对文本进行排序吗?

2024-09-27 19:28:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有Python中的dict,其键的形式如下:

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,
          }

有些指数没有子值,有些指数有一级子值,有些指数有两级子值。如果我只有一个子级别,我就可以把它们都当作数字并按数字排序。第二个子层迫使我把它们都当作字符串来处理。但是,如果我像字符串一样对它们排序,我将在1之后有10,在2之后有20

如何正确排序索引?

注意:我真正想做的是打印出按索引排序的dict。如果有比分类更好的方法,那对我来说没问题。


Tags: 方法字符串排序etc分类数字指数级别
3条回答

可以按所需的方式对键进行排序,方法是将键拆分为“.”,然后将每个组件转换为整数,如下所示:

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()。请参阅Ian Clelland的答案,以获取有关该问题的示例。

作为Ian Clelland's答案的附录,map()调用可以替换为列表理解。。。如果你喜欢那种风格。它可能也会更有效(尽管我怀疑在这个案例中是疏忽大意的)。

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

相关问题 更多 >

    热门问题