将包含日期的列表排序为子字符串

时间:2015-03-16 05:24:17

标签: python

我有一个像这样的字符串列表    正如您所知,在字符串的开头嵌入了一个日期    在字符串的末尾。

 a = ["08/19/2014100%ABC10/02/2014F","02/12/2012100%ABC10/02/2014F",
      "08/29/2014100%ABC10/02/2012F"]

我想根据日期子字符串对此列表进行排序。

我想要实现的方法是提取日期,对日期进行排序并使用子字符串加入日期,但它变得太复杂了。

2 个答案:

答案 0 :(得分:1)

只需调用sorted(),并将key参数设置为一个函数,该函数将字符串中的日期提取并转换为datetime.datetime对象。

>>> from datetime import datetime
>>> a = ["08/19/2014100%ABC10/02/2014F","02/12/2012100%ABC10/02/2014F", "08/29/2014100%ABC10/02/2012F"]
>>> sorted_a = sorted(a, key=lambda s: datetime.strptime(s[:10], '%m/%d/%Y'))
>>> sorted_a
['02/12/2012100%ABC10/02/2014F', '08/19/2014100%ABC10/02/2014F', '08/29/2014100%ABC10/02/2012F']

或者,如果您想进行排序:

>>> a.sort(key=lambda s: datetime.strptime(s[:10], '%m/%d/%Y'))
>>> a
['02/12/2012100%ABC10/02/2014F', '08/19/2014100%ABC10/02/2014F', '08/29/2014100%ABC10/02/2012F']

如果您实际上是要对字符串中的最后一个日期进行排序,只需将键功能更改为:

lambda s: datetime.strptime(s[-11:-1], '%m/%d/%Y')

答案 1 :(得分:0)

以下代码定义了一个自定义排序函数compare,它从列表中获取两个元素,并根据每个字符串开头出现的日期对它们进行排序。如果要使用字符串末尾嵌入的日期,可以相应地修改代码。

def compare(item1, item2):
    format = '%m/%d/%Y' #changed the date format
    # convert string dates to Date type
    date1 = datetime.datetime.strptime(item1[:10], format).date() #removed comma from item1[:,10]
    date2 = datetime.datetime.strptime(item2[:10], format).date() #same as above

    if date1 < date2:
        return -1
    elif date1 > date2:
        return 1
    else:
        return 0

a = ["08/19/2014100%ABC10/02/2014F","02/12/2012100%ABC10/02/2014F",
  "08/29/2014100%ABC10/02/2012F"]

a.sort(compare)