假设我有一个这样的列表:
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")而不是将日期保存在列表中。列表如下所示
发布于 2018-09-10 22:56:03
通过使用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按年、月和日进行排序。然后按年份对已排序列表进行分组。结果列表最终按月份分组。
这将返回一个3级列表,该列表由以下内容组成:
这是从你的列表中得到的结果:
[[[['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.希望能有所帮助。
https://stackoverflow.com/questions/52253577
复制相似问题