【问题标题】:Equivalent for pop on strings等效于字符串弹出
【发布时间】:2012-06-15 12:24:40
【问题描述】:

给定一个非常大的字符串。我想在这样的循环中处理部分字符串:

large_string = "foobar..."
while large_string:
    process(large_string.pop(200))

有什么好的和有效的方法来做到这一点?

【问题讨论】:

  • 你到底想要什么?前 200 个字符?第200个字?还有什么?
  • @KarlKnechtel while 循环不是清楚地表明我要处理字符串的所有字符吗?
  • 看起来您想删除并处理 large_string 的第 200 个字符,直到 pop 抛出“IndexError: pop index out of range”

标签: python string string-parsing


【解决方案1】:

您可以将字符串包装在StringIOBytesIO 中并假装它是一个文件。这应该很快。

from cStringIO import StringIO
# or, in Py3/Py2.6+:
#from io import BytesIO, StringIO

s = StringIO(large_string)
while True:
    chunk = s.read(200)
    if len(chunk) > 0:
        process(chunk)
    if len(chunk) < 200:
        break

【讨论】:

  • 如果他想从最后消耗字符串,这是行不通的。
  • @ms4py 幸运的是,块的顺序对我的任务根本不重要
  • @ms4py:是的。在这种情况下,我会将字符串分割成一个列表并反向迭代:[large_string[i:i+200] for i in xrange(0, len(large_string), 200)]
  • @larsmans:或者,您可以使用缓冲区的 seek 方法读取最后 n 个字节:s.seek(-200, 2); chunk = s.read()...
  • io.StringIO 不需要 Py3 - 它从 2.6 开始存在。
【解决方案2】:

您可以将字符串转换为列表。 list(string) 并弹出它,或者您可以分块迭代列表 [] 或者您可以按原样切片字符串并分块迭代

【讨论】:

    【解决方案3】:

    您可以使用slicing

    large_string = "foobar..."
    while large_string:
        process(large_string[-200:])
        large_string = large_string[:-200]
    

    【讨论】:

    • 这很浪费。不仅因为它进行了两次切片,还因为它使用了 O(n²) 时间算法。
    【解决方案4】:

    要跟进 dm03514 的回答,您可以执行以下操作:

    output = ""
    ex = "hello"
    exList = list(ex)
    exList.pop(2)
    for letter in exList:
        output += letter
    
    print output # Prints 'helo'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 2013-06-16
      相关资源
      最近更新 更多