Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,我可以按文本的数值对文本进行排序吗?_Python_String_Sorting - Fatal编程技术网

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

在Python中,我可以按文本的数值对文本进行排序吗?,python,string,sorting,Python,String,Sorting,我用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 '1

我用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
20
之后添加
2

如何对索引进行正确排序


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

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

sorted(mydict.keys(), key=lambda a:map(int,a.split('.')))
[('0', 10),
 ('1', 23),
 ('2.0', 321),
 ('2.1', 3231),
 ('3', 3),
 # ...
 ('12.1.1', 2)]
其中返回以下内容:

['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('.')))
这将为您提供(键、值)对的排序列表,如下所示:

sorted(mydict.keys(), key=lambda a:map(int,a.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]
在这种情况下,最好使用
参数来
排序()
。请参阅的答案以获取示例。

我会在上搜索并查看答案。我也会读一读。该函数正是您需要的。

作为答案的补充,可以用列表替换
map()
调用。。。如果你喜欢那种风格。它也可能更有效(尽管我怀疑在这种情况下可以忽略不计)

sorted(mydict.keys(),key=lambda:[int(i)表示a.split('.')]中的i)
出于乐趣和实用性(主要用于谷歌ppl):

用作排序(列表,cmp=cmpg)
。 此外,正则表达式可能是预编译的(实际上,很少需要re模块的缓存)。 并且,它可以(容易地)修改,例如,包括负值(可能将
-?
添加到num regex)和/或使用浮点值

它可能不是很有效,但即使如此,它还是非常有用的


而且,嗯,它也可以用作key=for sorted()。

python网站上有一个很好的排序方法:。
它很好地介绍了排序,并讨论了使排序结果适应您需要的不同技术。

这称为“自然排序”。请参阅,当然您不需要使用lambda,您可以用通常的方式定义函数并传入名称。比comparator版本更快(转换/函数调用更少)。python 3的语法更新:
sorted(mydict.items(),key=lambda:[*map(int,a[0]。split('.)]
最好像Ian那样提供键函数。每个元素调用一次键函数,每次排序进行比较时调用cmp函数。@gnibbler:是的,我读了Ian的答案后意识到。。。我正在考虑删除我的答案,但我想这可能会对需要更复杂的比较的人有所帮助,而这不能通过传递一个简单的
键来完成。