每十年检索一次

时间:2018-01-09 12:29:00

标签: python

我尝试使用最少的代码检索数十年的列表:

def get_decade_list(start, end):
    nl = []
    while start < end:
        l = list(range(start, start+10))
        start += 10
        nl.append(l)
    return nl
print get_decade_list(2001, 2201)

输出:

[[2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010],
 [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020],
...
  [2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200],]

如何以pythonic方式完成这项任务?

4 个答案:

答案 0 :(得分:4)

在Python 2.7中我会做

[range(i, i + 10) for i in range(2001, 2201, 10)]

作为Python 2.7中的生成器

(range(i, i + 10) for i in xrange(2001, 2201, 10))

答案 1 :(得分:2)

我不确定该要求,但看起来您想要在给定范围内每10年返回一个值。您可以在一行中执行此操作,如下所示:

range(2001, 2211, 10)

输出:

[2001, 2011, 2021, 2031, 2041, 2051, 2061, 2071, 2081, 2091, 2101, 2111, 2121, 2131, 2141, 2151, 2161, 2171, 2181, 2191, 2201]

答案 2 :(得分:2)

那将是

[[x for x in range(i, i + 10)] for i in range(2001, 2201, 10)]

返回Python 2和3下的列表列表。

[[2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010],
 [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020],
 [2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030],
 [2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, 2040],
  ... (omitted)
 [2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200]]

答案 3 :(得分:0)

使用一些python技巧:

  • iter:创建一个迭代器
  • ]*10:将列表中的元素相乘
  • izip:来自itertools
  • izip(*args):这是解压缩功能
  • map:转换每个元素

和所有在一起:

from itertools import izip

def get_decade_list(start, end):
    args = [iter(xrange(start, end))] * 10
    return list(map(list, izip(*args)))

print get_decade_list(2001, 2201)

结果是:

[[2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010], 
 ...
 [2191, 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200]]

如果end不是XX01,则存在一些差异,此版本仅获得完整的十年。