【问题标题】:pythonic way of sorting a log lexicographicallypythonic按字典顺序排序日志的方法
【发布时间】:2018-09-26 18:37:06
【问题描述】:

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

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

【问题讨论】:

    标签: python data-structures standard-library


    【解决方案1】:

    如您所见,您示例中的 key 函数仅按值排序。如果您还想按键排序,则可以将值和键(按该顺序)作为元组返回:

    >>> 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')

    【讨论】:

    • 你能解释一下上面的代码是如何工作的吗?x[1] 和 x[0] 表示必须维护的优先级?
    • @Ani 我在回答中提供了更多详细信息,如果还不清楚,请随时询问。
    【解决方案2】:

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

    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 函数将使用 tuple(value, key) 并按字母数字顺序对它们进行排序。

    【讨论】:

    • 可能不是一个好主意,有序字典在内部保留了一个链表,如果你有很多元素,这会占用大量内存。
    • 我发现这篇文章很好地解释了利弊:stackoverflow.com/a/18951209/9655255
    • @Ding 没有提到性能要求,OrderedDict 在标准库中,为什么它“不好”?也许你可以评论,“如果你还不知道,记忆很重要......”。因为你的评论很有见地,它确实告诉了我,至少。谢谢。
    猜你喜欢
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2021-05-15
    • 2020-08-02
    • 2015-06-23
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多