【问题标题】:Python. Sort list of dicts by splitting string keyPython。通过拆分字符串键对字典列表进行排序
【发布时间】:2017-11-23 11:42:44
【问题描述】:

我有一个这样的字典列表:

my_list=[{'c': '1/2014'},
{'c': '1/2015'},
{'c': '10/2014'},
{'c': '2/2014'},
{'c': '3/2014'},
{'c': '1/2011'},
{'c': '2/2011'},
{'c': '3/2011'},
{'c': '6/2014'},
{'c': '5/2014'},
{'c': '10/2014'},
{'c': '2/2015'},
{'c': '4/2015'},
{'c': '3/2015'},
{'c': '5/2016'},
{'c': '1/2017'}]

我想按 c 键排序我的列表。 密钥有两个部分:year_counter / year,所以首先我必须按年排序,然后按 year_counter,在每年的组内。 最后我希望有这个:

my_list=[{'c': '1/2011'},
 {'c': '2/2011'},
 {'c': '3/2011'},
 {'c': '1/2014'},
 {'c': '2/2014'},
 {'c': '3/2014'},
 {'c': '5/2014'},
 {'c': '6/2014'},
 {'c': '10/2014'},
 {'c': '1/2015'},
 {'c': '2/2015'},
 {'c': '3/2015'},
 {'c': '4/2015'},
 {'c': '11/2015'},
 {'c': '5/2016'},
 {'c': '1/2017'}]

实现这一目标的最有效方法是什么?

【问题讨论】:

  • 是的,我试过这个:sorted(my_list, key=lambda x: (x['c']).split('/')[::-1], reverse=False)。但是,我需要像整数一样考虑 tyer counter。如果我使用这种方式,我会得到: [{'c': '1/2011'}, {'c': '2/2011'}, {'c': '3/2011'}, {'c': '1/2014'}, {'c': '10/2014'}, {'c': '10/2014'}, {'c': '2/2014'}, {'c': '3 /2014'}, {'c': '5/2014'}, {'c': '6/2014'}, {'c': '1/2015'}....}] 并得到 {' c': '1/2014'}, {'c': '10/2014'}, {'c': '10/2014'}, {'c': '2/2014'},而不是 {' c': '1/2014'}, {'c': '2/2014'}, {'c': '10/2014'}, {'c': '10/2014'},
  • 只需将两者都转换为 int 即可。 [int(i) for i in v['c'].split('/')][::-1]。它不漂亮,但似乎有效。
  • 好的,谢谢。它工作。

标签: python python-3.x list sorting dictionary


【解决方案1】:

我认为应该先将monthyear 拆分,然后应用某种排序算法对其进行排序。

您可以为此使用underscore 库。注意我的fiddle

https://jsfiddle.net/stdeepak22/96trt0r4/1/

首先我将c 的值拆分为月份和年份。

var split_list = _.map(my_list, function(r){
    return {
      mn : parseInt(r.c.split('/')[0]),
      yr : parseInt(r.c.split('/')[1])
    };
  }); 

然后我应用排序然后再次加入实际字段c

var sorted_list= _.chain(split_list)
  .sortBy(function(f)
  {
    return f.mn;
  }).sortBy(function(f)
  {
    return f.yr;
  }).map(function(obj)
  {
    return { c: obj.mn+'/'+obj.yr }
  }).value();

然后我在控制台上打印以检查输出。

console.log(sorted_list);

最初我忘记将月份和年份值解析为 int。我现在已经更正了。

更新 一开始你没有打标签,Python我以为你在找json,所以我提供了JavaScript解决方案。

【讨论】:

  • 你忘了from __future__ import braces ;)
  • 是的,对不起,我的错误,没问题。
猜你喜欢
  • 2015-08-05
  • 2013-05-22
  • 2019-07-03
  • 2018-08-13
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多