按字典顺序排序日志的pythonic方法

时间:2018-04-16 22:31:21

标签: python data-structures standard-library

我是python的新手。我正在尝试解决一个问题。让我们假设我得到一个带有标识符的日志文件,后跟空格分隔的单词。我需要根据单词对日志进行排序(标识符可以省略)。但是,如果单词匹配,我需要根据标识符进行排序。所以我正在构建一个字典,标识符是键,单词是值。为简单起见,我在下面使用示例。如何按值对字典进行排序,然后在值匹配时按键排序?以下是一个例子。

>>> a_dict = {'aa1':'n','ba2' : 'a','aa2':'a'}
>>> a_dict
{'ba2': 'a', 'aa1': 'n', 'aa2': 'a'}

如果我按值对给定的字典进行排序,它就变成了这个。

>>> b_tuple = sorted(a_dict.items(),key = lambda x: x[1])
>>> b_tuple                                                                                                                                                                                                                                  
[('ba2', 'a'), ('aa2', 'a'), ('aa1', 'n')]

然而,预期的输出应该如下所示

  

[('aa2','a'),('ba2','a'),('aa1','n')]

原因是如果值相同,则必须按键对字典进行排序。有关如何做到这一点的任何建议?

2 个答案:

答案 0 :(得分:4)

您的示例中的key函数只会按值排序,因为您已经注意到了。如果您还想按键排序,那么您可以将值和键(按此顺序)作为元组返回:

>>> sorted(a_dict.items(), key=lambda x: (x[1], x[0]))
[('aa2', 'a'), ('ba2', 'a'), ('aa1', 'n')]

令人困惑的部分是,您的数据看起来像('aa2', 'a'),但由于('a', 'aa2')而被排序为(x[1], x[0])

答案 1 :(得分:2)

您可以使用集合模块中的OrderedDict来存储已排序的值

imagecreatefromjpeg

编辑:我在(t [0],t [1])中混合了键和值。在键功能t [0]中给出键,t [1]给出值。已排序的函数将使用元组(值,键)并按字母数字顺序排序。