Python日期阵列

问题描述:

我有以下3个数组。Python日期阵列

years=[2011,2012,2012] 
monthes=[01,02,03] 
days=[10,20,30] 

有没有办法将其转成日期的阵列,而不使用循环,这意味着一个方法/库,可以整数阵列组合成阵列日期?

dates = [2011/01/10,2012/02/20,2013/03/30] 
+2

-1荒谬的限制 – wim 2014-09-29 21:43:35

+0

@isedev:在Python 3.x中,这是一个'SyntaxError',但是在2.x中,它是完全有效;他只是用八进制来指定数字'1','2'和'3',没有什么理由。然后再次,_last_行显然是无效的... – abarnert 2014-09-29 21:55:20

+0

@abanert有效点(我使用3.x)。 – isedev 2014-09-29 21:57:26

map(lambda t: "/".join(map(str, t)), zip(years, monthes, days)) 
+0

'map'里面有一个循环。 – abarnert 2014-09-29 21:53:33

+0

@abarnert:CPython实现的确如此。根据所使用的实现,'map'可以在没有循环的情况下实现。 – mipadi 2014-09-29 22:00:08

+0

嗯,它被定义为“为迭代的每个元素”工作。我想如果你写了一个实现,它的行为无法区分,就好像它循环遍历一个迭代,但实际上,比如使用递归与TCO,这可能是有效的,但这似乎有点延伸。 – abarnert 2014-09-29 22:06:23

试试这个:

dates = ['/'.join(map(str,x)) for x in zip(years,months,days)] 

例子:

>>> years=[2011,2012,2012] 
>>> months=['01','02','03'] 
>>> days=[10,20,30] 
>>> ['/'.join(map(str,x)) for x in zip(years,months,days)] 
['2011/01/10', '2012/02/20', '2012/03/30'] 
+0

这里有两个循环,列表理解中有一个明确的循环,另一个隐藏在map中。 – abarnert 2014-09-29 21:54:07

+1

@abanert更不用说'zip'中的循环了;) – isedev 2014-09-29 21:59:22

+0

好吧,这是Python 3,你可以争辩说循环被折叠到'map'循环中,因为'join'只对它的参数进行一次迭代恰好是构建在另一个迭代器上的迭代器......但是,你说得对,我错过了它。 :) – abarnert 2014-09-29 22:02:44

如果你不希望任何循环,你必须手动 “展开” 的事情。这几乎总是做一件很无聊的事情,这种情况下也不例外,但每当你知道的东西长度静态,这是可以做到:

dates = [] 
dates.append('{}/{:02}/{:02}'.format(years[0], monthes[0], days[0])) 
dates.append('{}/{:02}/{:02}'.format(years[1], monthes[0], days[1])) 
dates.append('{}/{:02}/{:02}'.format(years[2], monthes[2], days[2])) 

我留下了复制粘贴和 - 编辑错误在那里供您调试,以此作为“不重复自己”的一个示例,它是编程中的一个基本原则,因此“没有循环”是一个愚蠢的要求。


或者,你可以随时将任何环成一个递归调用,但(一)这是一个很无聊的事在Python做的,和(b)大多数计算机科学家可能会说这仍然是一个循环。但是,如果你真的想:

def format_dates(years, monthes, days): 
    if not years: 
     return [] 
    return (['{}/{:02}/{:02}'.format(years[0], monthes[0], days[0])] + 
      format_dates(years[1:], monthes[1:], days[1:])) 
dates = format_dates(years, monthes, days)