假设我有一个这样的列表:
list = [["A",datetime.datetime(1985,8,31,0,0)], ["B",datetime.datetime(2014,4,3,0,0)], ["C",datetime.datetime(2014,4,4,0,0)],["D",datetime.datetime(2014,6,9,0,0)], ["E",datetime.datetime(2015,6,1,0,0)], ["F",datetime.datetime(2015,2,7,0,0)]]
如何最优雅地按年份将其分组,按月将子组分组,以在Python中获得此列表输出,例如:
newlist = [["A",datetime.datetime(1985,8,31,0,0)], [[["B",datetime.datetime(2014,4,3,0,0)], ["C",datetime.datetime(2014,4,4,0,0)]],["D",datetime.datetime(2014,6,9,0,0)]], [["E",datetime.datetime(2015,6,1,0,0)], ["F",datetime.datetime(2015,2,7,0,0)]]]
因此,该值按年份分组,而不是按月分组,并且保留了顺序 我正在代码中导入datetime模块
import datetime
并应用strptime
kdate=year/month/day
date = datetime.datetime.strptime(kdate , "%m/%d/%Y")
比起我将日期保存在列表中。列表显示在上方
答案 0 :(得分:0)
通过使用 itertools.groupby ,您可以按年份分组,然后按月份分组。
表达式有点复杂,需要在应用任何groupby表达式之前对初始列表进行排序,但是它可以得到不错的结果。
newlist = [[list(subgroup) for _, subgroup in groupby(group, key=lambda i: i[1].strftime("%m"))] for _, group in groupby(sorted(mylist, key=lambda i: i[1].strftime("%Y%m%d")), key=lambda i: i[1].strftime("%Y"))]
使用格式CCYYMMDD按年,月和日对初始列表进行排序。 然后将排序列表按年份分组。 结果列表最终按月分组。
这将返回一个三级列表,其中包括:
这是从您的列表中得到的结果:
[[[['A', datetime.datetime(1985, 8, 31, 0, 0)]]], [[['B', datetime.datetime(2014, 4, 3, 0, 0)], ['C', datetime.datetime(2014, 4, 4, 0, 0)]], [['D', datetime.datetime(2014, 6, 9, 0, 0)]]], [[['F', datetime.datetime(2015, 2, 7, 0, 0)]], [['E', datetime.datetime(2015, 6, 1, 0, 0)]]]]
这并不是您所期望的。但是这种结构的好处在于,它尊重嵌套在月份中的天和嵌套在年份中的月的层次结构。可以轻松地将其用作循环结构的输入(例如)。
for year in newlist:
for month in year:
for day in month:
# some code here.
希望它可以提供帮助。