2014-09-29 54 views
-2

我有以下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

回答

2
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

1

試試這個:

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

2

如果你不希望任何循環,你必須手動 「展開」 的事情。這幾乎總是做一件很無聊的事情,這種情況下也不例外,但每當你知道的東西長度靜態,這是可以做到:

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)