[Python] làm sao để xóa bỏ dấu xuống dòng khỏi chuỗi văn bản?

Tao đã viết một chương trình tách ra từng từ duy nhất trong một đoạn văn bản. Nó cũng có tùy chọn sắp xếp danh sách kết quả theo thứ tự bảng chữ cái và theo tần suất xuất hiện.

Ngay từ đầu, tao nhận thấy một vấn đề nếu cho nó một văn bản có xuống dòng. Dường như việc này khiến nó bị lặp lại như thể đang nhận nhiều đầu vào. Tao muốn kết quả được hiển thị trong một khối văn bản duy nhất. Trong khi đang test chương trình để xem output ra sao nếu nhập văn bản có xuống dòng, giờ nó lại làm những thứ kì quặc không hiểu nổi. Hoặc là nó không output gì, hoặc là nó bỏ qua bước chọn phương thức sắp xếp. Tao không hiểu chuyện gì đang xảy ra.

Đây là chương trình của tao kèm theo chú thích:

## một list tao dùng để loại bỏ dấu câu khỏi văn bản, ## tao copy-paste list này từ một website punc = ”’!()-[]{};:'”,<>./?@#$%^&*_~”’ ## hàm chính, nó nhận hai tham số: ## văn bản, và một biến chỉ định cách sắp xếp ## đối với biến thứ hai, 0 nghĩa là không sắp xếp, 1 nghĩa là sắp xếp theo bảng chữ cái, ## và 2 nghĩa là output được sắp xếp theo tần suất def vocab(text,sort_list): output=[] fixed_text=”” ## đây là nơi tao loại bỏ tất cả dấu câu for i in text: if i in punc: fixed_text+=” else: fixed_text+=i text=fixed_text.split() ## phần này là phần chính của hàm ## đầu tiên, nó kiểm tra xem list có cần được sắp xếp hay không ## câu lệnh này được dùng nếu không sắp xếp, ## hoặc nếu sắp xếp theo bảng chữ cái if sort_list<2: for i in text: if i not in output: output.append(i) ## cái này tạo ra một list hai chiều ## index 0 ghi lại tần suất của từ ## và index 1 ghi lại chính từ đó if sort_list==2: for i in text: in_list=False for u in output: if i==u[1]: u[0]+=1 in_list=True break if in_list==False: word=[1,i] output.append(word) ## và đây là phần sắp xếp ## đầu tiên nó sắp xếp list bằng phương thức .sort(), ## nó phải làm thế này bất kể phương thức sắp xếp nào được dùng if sort_list>0: output.sort() ## phần này dùng để sắp xếp dựa trên tần suất ## mặc định, phương thức .sort() sắp xếp list này theo index 0, ## và đối với những từ có index 0 giống nhau, nó sắp xếp theo bảng chữ cái ## Đây là vấn đề, vì bình thường bạn muốn các từ được sắp xếp theo tần suất ## được sắp xếp từ cao xuống thấp. Tuy nhiên, tao cũng thích các từ có tần suất bằng nhau ## được sắp xếp từ a đến z. Tao không biết có phương pháp đơn giản nào có thể làm được điều đó, ## nên tao đã nghĩ ra thuật toán này để đảo ngược thứ tự dựa trên ## dữ liệu tần suất thuần túy. if sort_list==2: unsorted_output=output sorted_output=[] output=[] ## đầu tiên, nó quét đơn giản để tìm giá trị tần suất cao nhất ## điều này cần thiết cho vòng lặp sắp xếp max_freq=0 for i in unsorted_output: if i[0]>max_freq: max_freq=i[0] ## ở đây nó duyệt qua list, bắt đầu từ index 0 và di chuyển bất kỳ ## từ nào có giá trị tần suất hiện tại vào list ‘sorted’. Lưu ý rằng ## sau đó tao chọn xóa mục nhập khỏi list đã sắp xếp với hy vọng điều này sẽ ## tăng tốc vòng lặp while max_freq>0: for i in unsorted_output: if i[0]==max_freq: sorted_output.append(i) del i max_freq-=1 ## phần này chỉ xóa các số tần suất để chúng không bị ## in ra for i in sorted_output: word=i[1] output.append(word) print(“”) print(output) print(“”) global first_prompt first_prompt=False yes=[‘yes’,’ye’,’y’,’yeah’] no=[‘no’,’n’] ## vòng lặp chính while True: sort_list=0 if first_prompt==True: print(“Bạn có muốn tiếp tục không?”) print(“”) choice=input() if first_prompt==False or choice in yes: print(“Nhập văn bản bạn muốn tạo danh sách từ vựng:”) print(“”) first_prompt=True elif choice in no: break ## đây là nơi đầu vào văn bản được lấy text=input() print(“”) text=text.lower() ## giờ người dùng được hỏi xem họ có muốn sắp xếp không, và nếu có ## họ muốn dùng phương thức sắp xếp nào print(“Bạn có muốn danh sách được sắp xếp không?”) print(“”) choice=input() print(“”) if choice in yes: print(“Nó nên được sắp xếp theo bảng chữ cái chứ?”) print(“”) choice=input() print(“”) if choice in yes: sort_list=1 if choice in no: print(“Các từ nên được sắp xếp theo tần suất chứ?”) print(“”) choice=input() if choice in yes: sort_list=2 if choice in no: sort_list=0 ## gọi hàm và đưa vào các tham số phù hợp vocab(text,sort_list)

Bây giờ, cái này hoạt động tốt bình thường, trừ khi văn bản tao nhập có xuống dòng. Nếu điều đó xảy ra, nó cho tao đủ loại output kì quái. Thêm nữa, tao để ý output khác nhau tùy thuộc vào việc tao mở chương trình trong idle của python hay command prompt, điều này KHÔNG HỀ hợp lý. Và đúng rồi, tao đang chắc chắn là đã lưu nó trước khi chạy từ icon (mặc định, nó mở trong command prompt nếu tao làm thế).

Đây là một ví dụ về một trong những văn bản tao đã dùng để test:

[Trên một ngọn đồi,] một con cừu không có lông thấy những con ngựa, một con đang kéo một chiếc xe nặng, một con đang mang một gánh nặng, và một con đang chở một người đàn ông rất nhanh.

Con cừu nói với những con ngựa: “Tim tôi đau nhói khi thấy một người đàn ông điều khiển ngựa.”

Những con ngựa nói: “Nghe này, cừu ơi, tim chúng tôi cũng đau nhói khi thấy điều này: một người đàn ông, ông chủ, làm cho lông cừu thành một bộ quần áo ấm áp cho chính mình.

Và con cừu thì không có lông.” Nghe vậy, con cừu bỏ chạy vào đồng bằng.

Tại sao chương trình của tao lại hoạt động như vậy? Tao nghĩ rằng tao có thể sửa nó bằng cách chỉ cần xóa các xuống dòng, nhưng tao không thể tìm ra cách làm điều đó. Code tao tìm thấy trên mạng không hoạt động với tao vì một lý do bí ẩn nào đó. Vì một lý do nào đó, chương trình của tao thẳng thừng từ chối xóa hoặc thay thế n hoặc r khỏi bất kỳ văn bản nào tao đưa cho nó. Cách duy nhất tao có thể tránh vấn đề này là chỉ cần copy-paste văn bản vào openoffice và tự tay xóa các xuống dòng, điều này khá bất tiện.

Làm thế nào để tao có thể xóa các xuống dòng này từ trong chương trình?