2013-07-18 9 views
5

これは小文字のみを抽出するanother answerの例です。 (Pythonの3)この場合空の文字列で翻訳

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

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

' ' * len(string.ascii_lowercase)は空白に小文字をマッピングします。だから私の期待は、すべて小文字は空白、「」に置き換えられますということですが、これは出力されます。

  1. はなぜ出力されますので、ここで

    'ghzdrkfd' 
    

    が私の質問です私の期待と違う?

  2. documentationを見ると、translateは1つの引数しか取りません。なぜそれは2つの議論を通過するのですか?

答えて

2

あなたは、Python 3.xのドキュメントにリンクされているが、translate()は、複数の引数で使用されている場合、このコードは、それが有効であるのPython 2.xからおそらくあります。ここにはdocumentationがあります。

そこからわかるように、2番目の引数はオプションで、入力文字列(Python 3.xでは文字をNoneにマッピングすることでこれを行う)から削除する必要がある文字を指定します。

"Agh#$%#%2341- -!zdrkfd".translate(table, delete_table)の場合、最初にdelete_tableにあるすべての文字が削除され、tableを使用して変換が実行されます。 delete_table以来

はスペースにすべて小文字を翻訳​​を使用して構築され、それが小文字以外のすべてのASCII文字を含む文字列になります。

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

だから、他のすべての文字が文字列から削除されます、 tableの翻訳ではstring.maketrans('', '')が使用されているため何も変更されません。

0

メンババージョンtranslate()と静的関数があります。 1つの引数を持つメンバのバージョンは期待どおりに機能しますが、これはおそらく間違っていると思われます。

>>> "Agh#$%#%2341- -!zdrkfd".translate(delete_table) 
'A #$%#%2341- -!  ' 
関連する問題