按字典顺序对日志进行排序的python方法

按字典顺序对日志进行排序的python方法,python,data-structures,standard-library,Python,Data Structures,Standard Library,我是python的新手。我正在尝试解决一个问题。假设我得到一个带有标识符的日志文件,后跟空格分隔的单词。我需要根据单词对日志进行排序(标识符可以省略)。但是,如果单词匹配,我需要根据标识符进行排序。所以我正在构建一个字典,标识符是关键字,单词是值。为了简单起见,我使用下面的示例。如果值匹配,如何按值对字典排序,然后按键排序?下面是一个例子 >>> a_dict = {'aa1':'n','ba2' : 'a','aa2':'a'} >>> a_dict {'b

我是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')]

原因是如果值相同,则字典必须按键排序。关于如何做到这一点,有什么建议吗

您可以使用collections模块中的

from collections import OrderedDict
a_dict = {'aa1':'n','ba2' : 'a','aa2':'a'}
sorted_by_key_then_value = sorted(a_dict.items(), key=lambda t: (t[1], t[0])))
sort_dict = OrderedDict(sorted_by_key_then_value)

编辑:我混淆了(t[0],t[1])中的键和值。在键函数t[0]中给出键,t[1]给出值。排序函数将使用元组(值、键)并按字母数字顺序对它们进行排序。

您的示例中的
函数只按值排序,正如您所注意到的那样。如果还希望按键排序,则可以将值和键(按该顺序)作为元组返回:

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

令人困惑的是,例如,您的数据看起来像
('aa2','a')
,但由于
(x[1],x[0])
,它被排序为
('a','aa2')
,这可能不是一个好主意,有序字典在内部保留一个链接列表,我发现这篇文章很好地解释了它的优点和缺点:@Ding没有提到性能要求,标准库中有一个已订购的DICT,为什么它“不好”?也许你可以评论,“如果你还不知道,记忆很重要……”。因为你的评论很有见地,至少它告诉了我。谢谢。您能解释一下上面的代码是如何工作的吗?x[1]和x[0]表示必须维护顺序的优先级?@Ani我在回答中提供了更多细节,如果仍然不清楚,请尽管问。