代码之家  ›  专栏  ›  技术社区  ›  Zitrax dudico

Python中的字符串操作

  •  1
  • Zitrax dudico  · 技术社区  · 16 年前

    str[i] = 'e'
    

    由于字符串是不可变的,这在python中不能直接工作。在python中执行此操作的首选方式是什么?

    string.replace() 函数,但它返回字符串的副本,这听起来不是很理想,因为在这种情况下,字符串是一个完整的文件。

    4 回复  |  直到 16 年前
        1
  •  12
  •   Nicholas Riley    16 年前

    array.array :

    >>> import array
    >>> a = array.array('c', 'foo')
    >>> a[1] = 'e'
    >>> a
    array('c', 'feo')
    >>> a.tostring()
    'feo'
    

    mmap

    >>> f = open('foo', 'r+')
    >>> import mmap
    >>> m = mmap.mmap(f.fileno(), 0)
    >>> m[:]
    'foo\n'
    >>> m[1] = 'e'
    >>> m[:]
    'feo\n'
    >>> exit()
    % cat foo
    feo
    

    这是一个快速的基准测试脚本(对于非Unix操作系统,您需要用其他东西替换dd):

    import os, time, array, mmap
    
    def modify(s):
        for i in xrange(len(s)):
            s[i] = 'q'
    
    def measure(func):
        start = time.time()
        func(open('foo', 'r+'))
        print func.func_name, time.time() - start
    
    def do_split(f):
        l = list(f.read())
        modify(l)
        return ''.join(l)
    
    def do_array(f):
        a = array.array('c', f.read())
        modify(a)
        return a.tostring()
    
    def do_mmap(f):
        m = mmap.mmap(f.fileno(), 0)
        modify(m)
    
    os.system('dd if=/dev/random of=foo bs=1m count=5')
    
    measure(do_mmap)
    measure(do_array)
    measure(do_split)
    

    我在几年前的笔记本电脑上得到的输出与我的直觉相符:

    5+0 records in
    5+0 records out
    5242880 bytes transferred in 0.710966 secs (7374304 bytes/sec)
    do_mmap 1.00865888596
    do_array 1.09792494774
    do_split 1.20163106918
    

    cProfile

        2
  •  9
  •   Can Berk Güder Pugalmuni    16 年前
    l = list(str)
    l[i] = 'e'
    str = ''.join(l)
    
        3
  •  1
  •   Chris Upchurch    16 年前

        4
  •  0
  •   vartec    16 年前

    尝试:

    sl = list(s)
    sl[i] = 'e'
    s = ''.join(sl)