【问题标题】:Python: sorting items in a dictionary by a part of a key?Python:按键的一部分对字典中的项目进行排序?
【发布时间】:2013-03-25 14:26:25
【问题描述】:

假设我有一本国王字典,名字中的罗马数字作为键,整数形式的罗马数字作为值。

d = {'Zemco III': 3, 'Usamec XL': 40, 'Usamec VII': 7, 'Robert VIII': 8, 'Usamec XLII': 42, 'Mary XXIV': 24, 'Robert III': 3, 'Robert XV': 15, 'Usamec XLIX': 49}

我想从最老到最年轻的顺序对列表进行排序,即 Usamec XLII 应该排在 Usamec XLIX 之前。我还想按字母顺序对列表进行排序,即 Usamec XLII 应该在 Zemco III 之前。

我的方法是先按名称排序,然后按罗马数字值排序:

x = sorted(d.items(),key=operator.itemgetter(0))
y = sorted(x,key=operator.itemgetter(1))

但是,因为罗马数字是键的一部分,所以我的字母排序不能按预期工作。我的问题是,我可以按部分键对字典进行排序吗,例如,如果我的键是 Zemco III,我可以用 key.split()[0] 而不是整个键对我的项目进行排序吗?谢谢!

【问题讨论】:

    标签: python sorting dictionary key


    【解决方案1】:

    key 只是一个函数,它接收一个项目并返回您需要排序的内容。它可以是任何东西。

    这将按(name_without_rightmost_word, number) 键对项目进行排序:

    In [92]: sorted(d.items(), key=lambda (name, num): (name.rsplit(None, 1)[0], num))
    Out[92]:
    [('Mary XXIV', 24),
     ('Robert III', 3),
     ('Robert VIII', 8),
     ('Robert XV', 15),
     ('Usamec VII', 7),
     ('Usamec XL', 40),
     ('Usamec XLII', 42),
     ('Usamec XLIX', 49),
     ('Zemco III', 3)]
    

    如果你使用 python 3,使用这个key:

    lambda item: (item[0].rsplit(None, 1)[0], item[1])
    

     

    key.rsplit(None, 1)[0] 在多字名称的情况下优于key.split()[0]

    【讨论】:

    • 作为一个后续问题,如果我的字典是按数字排在第一位的,然后是名称,我又想按名称的第一部分排序怎么办?遵循相同的格式,我会得到:sorted(d.items(), key=lambda (num,name): (num,name.rsplit(None, 1)[0])),但我将如何合并key=operator.itemgetter(1) 之类的东西呢?谢谢
    • 如果按相同键排序,则元组应相同:(name.rsplit(None, 1)[0], num)。只有lambda 参数的顺序会改变。如果您仍然需要拆分名称,itemgetter 将无济于事。您的倒排字典将如何处理重复数字?
    【解决方案2】:

    要对其进行排序,您可以这样做:

    sorted_stuff = sorted([(ord(x[0]), x, y) for x, y in d.items()])
    final_sorted = [(y,z) for x,y,z in sorted_stuff]
    

    sorted_stuff 将如下所示:

    [(77, 'Mary XXIV', 24), (82, 'Robert III', 3)]
    

    final_sorted 将被正确格式化:

    [('Mary XXIV', 24), ('Robert III', 3)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 2011-06-06
      • 2012-03-19
      相关资源
      最近更新 更多