2013-07-18 30 views
5

Đây là ví dụ từ another answer chỉ trích xuất các chữ thường. (Python 3)dịch với chuỗi rỗng

import string 
delete_table = string.maketrans(
    string.ascii_lowercase, ' ' * len(string.ascii_lowercase) 
) 
table = string.maketrans('', '') 

"Agh#$%#%2341- -!zdrkfd".translate(table, delete_table) 

Trong trường hợp này, ' ' * len(string.ascii_lowercase) ánh xạ chữ thường vào một khoảng trắng. Vì vậy, kỳ vọng của tôi là tất cả các chữ thường sẽ được thay thế bằng '', một không gian trống, nhưng đây là kết quả:

'ghzdrkfd' 

Vì vậy, đây là những câu hỏi của tôi:

  1. Tại sao là sản phẩm khác với kỳ vọng của tôi?
  2. Khi tôi xem số documentation, translate chỉ nhận một đối số. Tại sao nó lại vượt qua hai đối số?

Trả lời

2

Bạn đã liên kết đến tài liệu 3.x Python, nhưng nếu translate() đang được sử dụng với nhiều tranh cãi sau đó mã này có lẽ là từ Python 2.x nơi đó là hợp lệ. Đây là số documentation.

Như bạn có thể thấy ở đó, đối số thứ hai là tùy chọn và nó chỉ định các ký tự sẽ bị xóa khỏi chuỗi đầu vào (trên Python 3.x bạn sẽ làm điều này bằng cách ánh xạ các ký tự đến None).

Vì vậy, đối với "Agh#$%#%2341- -!zdrkfd".translate(table, delete_table), đầu tiên tất cả các ký tự có mặt trong delete_table sẽ bị xóa và sau đó bản dịch được thực hiện bằng cách sử dụng table.

Kể từ delete_table được xây dựng bằng string.maketrans() dịch tất cả các chữ thường vào không gian, nó sẽ là một chuỗi có chứa tất cả các ký tự ASCII trừ chữ thường:

>>> delete_table = string.maketrans(string.ascii_lowercase, ' '*len(string.ascii_lowercase)) 
>>> delete_table 
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./:;<=>[email protected][\\]^_`       {|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff' 
>>> ''.join(c for c in map(chr, range(0, 256)) if c not in delete_table) 
'abcdefghijklmnopqrstuvwxyz' 

Vì vậy, tất cả các nhân vật khác sẽ được loại bỏ khỏi chuỗi, và sau đó bản dịch với table sẽ không sửa đổi bất cứ điều gì vì string.maketrans('', '') được sử dụng.

0

Có phiên bản thành viên translate() cũng như chức năng tĩnh. Phiên bản thành viên với một đối số hoạt động như bạn mong đợi, trong khi tôi tin rằng đó là phiên bản tĩnh mà bạn đang gọi ở trên, có lẽ không chính xác.

>>> "Agh#$%#%2341- -!zdrkfd".translate(delete_table) 
'A #$%#%2341- -!  '