【问题标题】:How to sort a dictionary based on different key fields?如何根据不同的关键字段对字典进行排序?
【发布时间】:2017-05-12 15:43:12
【问题描述】:

我有一本包含id,Direction,year,month,day,hour 的字典,我想根据month,day,hour 对其进行排序。下面是我的字典和它的值:

table = {('2339', 'W', '2016', '6', '2', '11'): [0],
         ('2339', 'W', '2016', '1', '16', '8'): [0],
         ('2339', 'W', '2016', '5', '8', '22'): [2],
         ('2339', 'W', '2016', '1', '17', '3'): [0]}

以及我用来排序的代码:

    result_dict = sorted(table.items(), key=operator.itemgetter(0))

但这不会按照我想要的方式对其进行排序。如何根据月、日和小时对其进行排序。我想要的结果是这样的:

 ID   Direction  year   month  day  hour
2339    W        2016   1       1    0
2339    W        2016   1       1    1
2339    W        2016   1       1    2
2339    W        2016   1       1    3
...     ..      ..      ..      ..   ..

【问题讨论】:

  • 按月、日、小时排序是什么意思?从最新到最旧排序?
  • result_dict 的预期结构是什么?与原始的相同,但已排序?
  • 另外,Python 中的字典本质上是无序的,因此您的结果将是某种其他类型的数据结构。你想要什么样的结果?
  • @errata 是的与表相同的结构。

标签: python sorting dictionary


【解决方案1】:

升序:

sorted(table.items(), key=lambda (k,v): map(int, k[3:]))

降序:

sorted(table.items(), key=lambda (k,v): map(int, k[3:]), reverse=True)

【讨论】:

    【解决方案2】:

    假设排序是按字典顺序对值进行排序,并且相对于所有坐标升序,您可以利用元组默认排序,即字典顺序。

    例如:

    items = [(0, 1, 2), (0, 0, 2), (1, 0, 0)]
    
    s1 = sorted(items)  # [(0, 0, 2), (0, 1, 2), (1, 0, 0)]
    s2 = sorted(items, key=lambda t: (t[1], t[2]))  # [(1, 0, 0), (0, 0, 2), (0, 1, 2)]
    

    在原始table字典的情况下:

    result_dict = sorted(table.items(), key=lambda pair: (int(pair[0][3]),
                                                          int(pair[0][4]),
                                                          int(pair[0][5])))
    
    # [(('2339', 'W', '2016', '1', '16', '8'), [0]),
    #  (('2339', 'W', '2016', '1', '17', '3'), [0]),
    #  (('2339', 'W', '2016', '5', '8', '22'), [2]),
    #  (('2339', 'W', '2016', '6', '2', '11'), [0])]
    

    【讨论】:

    • 你为什么不把它变成一个类,它很容易用任何字段排序。
    • @Tushortz,这是个好主意。您为什么不将其发布为答案?
    【解决方案3】:

    您的元组中的最后四个条目已经设置为递减重要性。所以只需对它们进行切片并使用默认的元组比较。请注意,您必须将字符串映射到整数才能正确比较它们(否则'10' < '2')。

    sorted_keys = sorted(table, key=lambda k: map(int, k[2:]))
    print sorted_keys
    # [('2339', 'W', '2016', '1', '16', '8'), 
    #  ('2339', 'W', '2016', '1', '17', '3'), 
    #  ('2339', 'W', '2016', '5', '8', '22'), 
    #  ('2339', 'W', '2016', '6', '2', '11')]
    

    然后,您可以遍历这组键来做任何您想做的事情。

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2015-11-23
      相关资源
      最近更新 更多