自定义在python中排序列表

时间:2016-05-06 07:26:23

标签: python list sorting date-sorting

我想将以下列表排序为一些元素作为日期,一些是Quarters。

input_ls = ['Nov-2015', 'Quarter 1, 2016', 'Jan-2016', 'Dec-2015',
           'Feb-2016', 'Quarter 4, 2015']

预期输出如下。我怎么能这样做?

output_ls = ['Quarter 1, 2016', 'Feb-2016', 'Jan-2016', 'Quarter 4, 2015'
             'Dec-2015', 'Nov-2015']

2 个答案:

答案 0 :(得分:2)

以下是使用datetutilregex的解决方案:

-vcodec libx264rgb

这就是输出的样子: enter image description here

以下是使用排序键的另一种方法,可能是最pythonic方式 - 在Martijn Pieters的帮助下

from dateutil import parser
import re
input_ls = ['Nov-2015', 'Quarter 1, 2016', 'Jan-2016', 'Dec-2015','Feb-2016', 'Quarter 4, 2015']
res = []
for x in input_ls:
    #Match x if it is having a digit followed by a comma followed by a space and followed by four digits
    qtr = re.findall('(\d),\s(\d{4})',x)
    #If match not found parse it as date by prefixing '1,' to the string
    if len(qtr) == 0:
        res.append(parse('1,' + x))
    #If matching then format it to a string format that is acceptable to the dateutil parser
    else:
        res.append(parse(str(int(qtr[0][0])*3)+'-30-'+qtr[0][1]))
#Sort the output list
out = zip(res,input_ls)
out.sort()
#Reverse it 
out.reverse()

这就是输出的样子:

enter image description here

答案 1 :(得分:0)

问题变更后的新答案:

您需要制作日历月份和日历的映射。四分之一到数字以满足您的预期输出。一个例子可能是:

mapping = {'Jan':1, 'Feb':2, .. 'Quarter 1':4, .. }

然后迭代列表,解析每个条目并将其映射到一个数字以进行排序。

i_map = {}
for i in input_ls:
    # for 'Nov-2015' format
    i1 = i.split('-')
    if len(i1) == 1:
        # For 'Quarter 1, 2015' format
        i1 = i.split(',')

    # Now map it to a number for sorting 
    i_map[mapping[i1[0]]] = i

# Now sort i_map by key
i_map_sorted = sorted(i_map, key=lambda (k,v) : k) 

# Now you can iterate over the sorted object & print its values

问题变更前的旧答案:

如果您想要字典的自定义排序顺序,可以使用像这样的lambda函数

sorted(input_dic.items(), key=lambda (key,value) : <fn of key & value>) 

你能用伪代码指定逻辑顺序吗?

要颠倒顺序,请在上述功能中添加reverse=True

如果您只想对值进行排序,请循环遍历字典并单独对它们进行排序,例如

from collections import OrderedDict
new_dict = OrderedDict()
for k,v in mydict.items():
    new_dict[k] = sorted(v, key=<some fn>, reverse=True)

如果您想按日历月份值(不是按字母顺序排序)进行排序,则需要在自定义排序功能中进行查找,以将月份映射到数字,例如{&#39; Jan&#39;:1,&#39; 2月&#39;:2,...}

P.S。 sorted fn的输出将是一个元组。如上面的评论中所指出的,如果你想保持字典结构,请使用OrderedDict。