2013-07-18 18 views
5

Questo è un esempio da another answer che estrae solo le lettere minuscole. (Python 3)translate con stringa vuota

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

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

In questo caso, il ' ' * len(string.ascii_lowercase) mappe lettere minuscole a uno spazio vuoto. Così la mia aspettativa è che le tutte le lettere minuscole saranno sostituiti con '', uno spazio vuoto, ma questo è l'output:

'ghzdrkfd' 

Così qui sono le mie domande:

  1. Perché è l'uscita diverso dalle mie aspettative?
  2. Quando guardo lo documentation, translate accetta solo un argomento. Perché vengono passati due argomenti?

risposta

2

Hai legato alla documentazione 3.x di Python, ma se translate() viene utilizzato con più argomenti, allora questo codice è probabilmente da Python 2.x dove sia valida. Ecco lo documentation.

Come potete vedere qui, il secondo argomento è facoltativo e specifica i caratteri che dovrebbero essere cancellati dalla stringa di input (su Python 3.x si farebbe questo mappando i caratteri a None).

Quindi per "Agh#$%#%2341- -!zdrkfd".translate(table, delete_table), tutti i caratteri presenti in delete_table vengono rimossi e quindi viene eseguita una traduzione utilizzando table.

Dal delete_table è costruito utilizzando string.maketrans() tradurre tutte le lettere minuscole allo spazio, sarà una stringa che contiene tutti i caratteri ASCII ad eccezione di lettere minuscole:

>>> 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' 

Così tutti gli altri caratteri saranno rimossi dalla stringa, e quindi la traduzione con table non modificherà nulla poiché viene utilizzato string.maketrans('', '').

0

C'è una versione membro di translate() e una funzione statica. La versione del membro con un argomento funziona come ci si aspetta, mentre credo che sia la versione statica che si sta chiamando sopra, forse in modo errato.

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