【问题标题】:Fastest way to insert these dashes in python string?在python字符串中插入这些破折号的最快方法是什么?
【发布时间】:2013-01-17 20:55:23
【问题描述】:

所以我知道 Python 字符串是不可变的,但我有一个字符串:

c['date'] = "20110104"

我想转换成哪个

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

我的代码:

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

看起来有点复杂,不是吗?最好将它保存为一个单独的变量然后做同样的事情吗?还是说基本没有区别?

【问题讨论】:

    标签: python string string-formatting


    【解决方案1】:

    您可以使用.join() 稍微清理一下:

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

    【讨论】:

    • 如果性能是 OP 所说的“更快”,我发现 '-'.join((d[:4],d[4:6],d[6:])) 稍微快一些(即元组而不是列表)。
    • 这对我来说看起来非常干净和pythonic :)
    • 简单优雅的解决方案!
    【解决方案2】:

    日期是 Python 中的第一类对象,具有用于操作它们的丰富接口。图书馆是datetime。

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

    不要重新发明轮子!

    【讨论】:

    【解决方案3】:

    将连字符添加到日期时间的一系列字符串中

    import datetime
    for i in range (0,len(c.date)):
      c.date[i] = datetime.datetime.strptime(c.date[i],'%Y%m%d').date().isoformat()
    

    【讨论】:

      【解决方案4】:

      我通常不会说“使用正则表达式”,但这是一个很好的用例:

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

      【讨论】:

        【解决方案5】:

        你最好使用字符串格式而不是字符串连接

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

        字符串连接通常较慢,因为正如您在上面所说的那样,字符串是不可变的。

        【讨论】:

          【解决方案6】:
          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 ns
          • option_1a:每个循环 35.8 ns
          • option_2:每个循环 36 ns
          • option_3:每个循环 35.8 ns
          • option_original:每个循环 36 ns

          所以...选择最易读的,因为性能改进是微不足道的

          【讨论】:

            【解决方案7】:

            我可能会这样做,并不是说有很大的收获:

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

            最大的改进(恕我直言)是避免字符串连接。

            【讨论】:

              【解决方案8】:

              我不确定您是否要将其转换为正确的日期时间对象,或者只是对格式进行硬编码,您可以执行以下操作:

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

              输入:'20110104'

              输出:'2011-01-04'

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-09-04
                • 2017-04-04
                • 2014-01-26
                • 1970-01-01
                • 1970-01-01
                • 2021-06-25
                相关资源
                最近更新 更多