Tùy thuộc vào cách mà trường hợp sử dụng của bạn sẽ tiêu thụ chuỗi, cách nhanh hơn để loại bỏ nó có thể là do không loại bỏ nó.
Nếu bạn có kế hoạch truy cập các dòng trong chuỗi tuần tự, bạn có thể tạo một trình phát bỏ qua dòng đầu tiên và cuối cùng trong khi sinh ra mỗi dòng đang được tiêu thụ thay vì xây dựng một bộ bản sao mới của tất cả các dòng.
Một cách đặc biệt để tránh dòng đầu tiên và cuối cùng là lặp qua chuỗi mà không tạo bản sao không cần thiết bằng cách theo dõi ba dòng tiếp theo và chỉ trả lại dòng thứ hai, cách lặp lại này sẽ kết thúc trước khi tiếp cận dòng cuối cùng mà không cần phải biết vị trí của ngắt dòng cuối cùng.
Chức năng sau đây sẽ cho bạn những kết quả mong muốn:
def split_generator(s):
# Keep track of start/end positions for three lines
start_prev = end_prev = 0
start = end = 0
start_next = end_next = 0
nr_lines = 0
for idx, c in enumerate(s):
if c == '\n':
nr_lines += 1
start_prev = start
end_prev = end
start = start_next
end = end_next
start_next = end_next
end_next = idx
if nr_lines >= 3:
yield s[(start + 1) : end]
# Handle the case when input string does not finish on "\n"
if s[-1] != '\n' and nr_lines >= 2:
yield s[(start_next+1):end_next]
Bạn không thể thử nghiệm nó với:
print("1st example")
for filtered_strs in split_generator('first\nsecond\nthird'):
print(filtered_strs)
print("2nd example")
for filtered_strs in split_generator('first\nsecond\nthird\n'):
print(filtered_strs)
print("3rd example")
for filtered_strs in split_generator('first\nsecond\nthird\nfourth'):
print(filtered_strs)
print("4th example")
for filtered_strs in split_generator('first\nsecond\nthird\nfourth\n'):
print(filtered_strs)
print("5th example")
for filtered_strs in split_generator('first\nsecond\nthird\nfourth\nfifth'):
print(filtered_strs)
Will tạo ra kết quả:
1st example
second
2nd example
second
3rd example
second
third
4th example
second
third
5th example
second
third
fourth
Lưu ý rằng lớn nhất lợi thế của phương pháp này là sẽ chỉ tạo ra một dòng mới vào thời điểm đó và sẽ hầu như không có thời gian để tạo ra dòng đầu tiên đầu ra (thay vì chờ tất cả các dòng được tìm thấy trước khi tiếp tục) nhưng, một lần nữa, điều đó có thể hữu ích hay không tùy thuộc vào trường hợp sử dụng của bạn.
Bạn có thể kiểm soát như thế nào chuỗi vào chương trình của bạn, ví dụ: bạn đang làm 'my_string = file_obj.read()' để lấy chuỗi? Ngoài ra, bạn có cần tất cả các dòng có trong bộ nhớ tại một thời điểm, hoặc chỉ là một dòng tại một thời điểm được không? –