代码之家  ›  专栏  ›  技术社区  ›  Ani

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

  •  -1
  • Ani  · 技术社区  · 6 年前

    我是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 回复  |  直到 6 年前
        1
  •  4
  •   cr3    6 年前

    这个 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])

        2
  •  2
  •   TwistedSim    6 年前

    您可以使用 OrderedDict 从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]给出值。排序函数将使用元组(值、键)并按字母数字顺序对其排序。