使用Python创建列表列表

时间:2015-07-08 13:05:43

标签: python list python-2.7

我列出了从2003年到2005年的12月到2月的年份和日期。我想将此列表分成12月到2月的年份列表:

a = ['2003337', '2003345', '2003353', '2003361', '2004001', '2004009', '2004017', '2004025', '2004033', '2004041', '2004049', '2004057', '2004337', '2004345', '2004353', '2004361', '2005001', '2005009', '2005017', '2005025', '2005033', '2005041', '2005049', '2005057']

输出应该是:

b = [['2003337', '2003345', '2003353', '2003361', '2004001', '2004009', '2004017', '2004025', '2004033', '2004041', '2004049', '2004057'] ['2004337', '2004345', '2004353', '2004361', '2005001', '2005009', '2005017', '2005025', '2005033', '2005041', '2005049', '2005057']]

然后遍历每个列表列表。我可以使用even splitting,但有可能错过年份。所以最好不要均匀分割。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

转换为datetime,然后按结尾最近的年份分组。

import datetime
import itertools

#convert from a "year-day" string to a datetime object
def datetime_from_year_day(s):
    year = int(s[:4])
    days = int(s[4:])
    return datetime.datetime(year=year, month=1, day=1) + datetime.timedelta(days=days-1)

#returns the year whose end is closest to the date, whether in the past or future
def nearest_year_end(d):
    if d.month <= 6:
        return d.year-1
    else:
        return d.year

a = ['2003337', '2003345', '2003353', '2003361', '2004001', '2004009', '2004017', '2004025', '2004033', '2004041', '2004049', '2004057', '2004337', '2004345', '2004353', '2004361', '2005001', '2005009', '2005017', '2005025', '2005033', '2005041', '2005049', '2005057']

result = [list(v) for k,v in itertools.groupby(a, lambda s: nearest_year_end(datetime_from_year_day(s)))]
print result

结果:

[['2003337', '2003345', '2003353', '2003361', '2004001', '2004009', '2004017', '2004025', '2004033', '2004041', '2004049', '2004057'], ['2004337', '2004345', '2004353', '2004361', '2005001', '2005009', '2005017', '2005025', '2005033', '2005041', '2005049', '2005057']]

答案 1 :(得分:0)

您也可以通过在for循环中嵌套2 if-else来完成此操作。这也很容易理解

a = ['2003337', '2003345', '2003353', '2003361', '2004001', '2004009', '2004017', '2004025', '2004033', '2004041', '2004049', '2004057', '2004337', '2004345', '2004353', '2004361', '2005001', '2005009', '2005017', '2005025', '2005033', '2005041', '2005049', '2005057']
temp = []
b = []
for day in a:
    if len(temp)==0:
        temp.append(day)
    else:
        if int(temp[-1][4:]) < 60 and int(day[4:]) > 335:
            b.append(temp)
            temp = []
            temp.append(day)
        else:
            temp.append(day)
print b

结果 -

[['2003337', '2003345', '2003353', '2003361', '2004001', '2004009', '2004017', '2004025', '2004033', '2004041', '2004049', '2004057'], ['2004337', '2004345', '2004353', '2004361', '2005001', '2005009', '2005017', '2005025', '2005033', '2005041', '2005049', '2005057']]