2012-06-15 34 views
7

Cho một chuỗi rất lớn. Tôi muốn xử lý các phần của chuỗi trong vòng lặp như sau:Tương đương với pop trên dây

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

Cách tốt nhất và hiệu quả để làm việc này là gì?

+4

Chính xác bạn muốn gì? 200 ký tự đầu tiên? Nhân vật thứ 200? Thứ gì khác? –

+1

@KarlKnechtel Không phải là vòng lặp trong khi rõ ràng cho thấy rằng tôi muốn xử lý tất cả các ký tự của chuỗi? –

+1

Dường như bạn muốn loại bỏ và xử lý ký tự thứ 200 của chuỗi lớn cho đến khi pop ném "IndexError: chỉ mục pop ra khỏi phạm vi" –

Trả lời

14

Bạn có thể quấn dây trong một số StringIO hoặc BytesIO và giả vờ là một tệp. Điều đó sẽ khá nhanh.

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 
+2

Đánh bại tôi sau 6 giây. – mgilson

+0

Nếu anh ta muốn tiêu thụ chuỗi từ cuối này không hoạt động. – schlamar

+0

@ ms4py may mắn thay thứ tự của các khối không quan trọng chút nào cho nhiệm vụ của tôi –

6

bạn có thể chuyển đổi chuỗi thành danh sách. list(string) và bật nó, hoặc bạn có thể lặp lại trong khối slicing danh sách [] hoặc bạn có thể cắt các chuỗi như là và lặp trong khối

3

Bạn có thể làm điều này với slicing:

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

Điều này khá lãng phí. Không chỉ vì nó cắt hai lần, mà bởi vì nó sử dụng thuật toán thời gian O (n²). –