2013-01-17 41 views
7

所以我知道Python中的字符串是不可改變的,但我有一個字符串:在python字符串中插入這些破折號的最快方法?

c['date'] = "20110104" 

,我想轉換爲

c['date'] = "2011-01-04" 

我的代碼:

c['date'] = c['date'][0:4] + "-" + c['date'][4:6] + "-" + c['date'][6:] 

似乎有點錯綜複雜,不是嗎?最好將它保存爲一個單獨的變量,然後做同樣的事情?或者基本上沒有區別?

回答

12

你可以使用.join()清理乾淨,一點點:

d = c['date'] 
'-'.join([d[:4], d[4:6], d[6:]]) 
+2

如果性能是OP的意思是「更快」,我發現'' - '。join((d [:4],d [4:6],d [ 6:]))'稍微快一些(即元組而不是列表)。 – mgilson

+0

這看起來很乾淨,pythonic :) – LittleBobbyTables

6

您最好使用字符串格式比字符串連接

c['date'] = '{}-{}-{}'.format(c['date'][0:4], c['date'][4:6], c['date'][6:]) 

字符串連接一般是慢,因爲你上面說的字符串是不可變的。

1

我可能會做這樣一來,不就是有增益的大量工作:

d = c['date'] 
c['date'] = '%s-%s-%s' % (d[:4], d[4:6], d[6:]) 

大改進(imho)是避免字符串連接。

3
s = '20110104' 


def option_1(): 
    return '-'.join([s[:4], s[4:6], s[6:]]) 

def option_1a(): 
    return '-'.join((s[:4], s[4:6], s[6:])) 

def option_2(): 
    return '{}-{}-{}'.format(s[:4], s[4:6], s[6:]) 

def option_3(): 
    return '%s-%s-%s' % (s[:4], s[4:6], s[6:]) 

def option_original(): 
    return s[:4] + "-" + s[4:6] + "-" + s[6:] 

運行在每個%timeit產生這些結果

  • option_1:每次循環35.9納秒
  • option_1a:每次循環35.8納秒
  • option_2:每次循環36毫微秒
  • option_3:35.8 ns per loop
  • option_original:每個迴路36 ns

所以......挑最可讀的,因爲性能的提升是邊際

0

我不是一般的傢伙說:「使用正則表達式」,但這是一個很好的用例吧:

import re  
c['date']=re.sub(r'.*(\w{4})(\w{2})(\w{2}).*',r"\1-\2-\3",c['date']) 
2

日期是Python中的頭等對象,具有豐富的操作界面。圖書館是datetime

> import datetime 
> datetime.datetime.strptime('20110503','%Y%m%d').date().isoformat() 
'2011-05-03' 

不要重新發明輪子!

1

我不知道,如果你想將其轉換爲一個適當的日期時間對象或者說只是硬編碼的格式,你可以做到以下幾點:

from datetime import datetime 
result = datetime.strptime(c['date'], '%Y%m%d') 
print result.date().isoformat() 

輸入:「20110104」

輸出:'2011-01-04'

相關問題