2011-01-07 4 views
1

文字を辞書にマッピングする際にいくつか問題があります。私は何のためつもりだと、私は機能し、リストから返されるマップは、おそらく通過CHRを使用することができることを発見したいくつかの時間後にマップと範囲を使用してアスキー文字をマップする辞書を作成する

range(33,64) range(91,96) and range(123,126) 

の範囲小数ですべてのASCII文字の場合

counter = { '!': 0, '"': 0, '#': 0, '$': 0 } ... 

ですイテレーションの範囲は...

symbolMap = map(chr, range(33,64) + range (91,96) + range(123,126)) 

問題は、このマップは、アスキーテーブルにcorrospondないということである、と私は

をしようとすると、それが悪化します
counter = dict.fromkeys(symbolMap, 0) 

私のシェルセッションを参照してください。

>>> counter 
{'!': 0, '#': 0, '"': 0, '%': 0, '$': 0, "'": 0, '&': 0, ')': 0, '(': 0, '+': 0, '*': 0, '-': 0, ',': 0, '/': 0, '.': 0, '1': 0, '0': 0, '3': 0, '2': 0, '5': 0, '4': 0, '7': 0, '6': 0, '9': 0, '8': 0, ';': 0, ':': 0, '=': 0, '<': 0, '?': 0, '>': 0, '[': 0, ']': 0, '\\': 0, '_': 0, '^': 0, '{': 0, '}': 0, '|': 0} 
>>> chr(34) 
'"' 
>>> range(33,64) 
[33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63] 
>>> symbolMap 
['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '[', '\\', ']', '^', '_', '{', '|', '}'] 

誰かがそれを正しく行うマッピングされるようにこの問題を解決する方法を私に説明できます。

+2

私はあなたの問題が何であるかわからないので、あなたの質問を十分に読まなかったと思います。投稿したコードには、希望の出力が表示されます。注文が正しくないので投げられますか? 'dict'には命令がありません。 – aaronasterling

+1

'counter'には何が含まれていてはなりませんか? 「カウンター」には何が含まれていなければなりませんか? –

+0

一般的に数値と句読点にするコードが必要な場合は、string.punctuationとstring.digitsを確認してください。 –

答えて

3

辞書の順番は、印刷時にキーの値ではなく、必要でもありません。順序は実行しているPythonの実装に依存します。CPythonでは、その順序はキーのハッシュ値と挿入の順序に依存します。

すべての目的と目的のために、順序はランダムであると仮定する必要があります。

他の言葉:コードが機能します!

>>> symbol_map['/'] 
47 
:あなたは、各文字は文字の右側序に正しくマップされていることがわかりここ

>>> symbol_map = dict([(chr(x), x) for x in range(33,64) + range (91,96) + range(123,126)]) 
>>> symbol_map 
{'!': 33, '#': 35, '"': 34, '%': 37, '$': 36, "'": 39, '&': 38, ')': 41, '(': 40, '+': 43, '*': 42, '-': 45, ',': 44, '/': 47, '.': 46, '1': 49, '0': 48, '3': 51, '2': 50, '5': 53, '4': 52, '7': 55, '6': 54, '9': 57, '8': 56, ';': 59, ':': 58, '=': 61, '<': 60, '?': 63, '>': 62, '[': 91, ']': 93, '\\': 92, '_': 95, '^': 94, '{': 123, '}': 125, '|': 124} 

:あなたは文字の数と0の値を置き換えた場合

これは明確です

辞書の順序は、特定の順序で印刷する必要がない限り、違いはありません。

>>> for x in sorted(symbol_map): print x, 
... 
! " # $ % & ' () * + , - ./0 1 2 3 4 5 6 7 8 9 : ; <=> ? [ \ ]^_ { | } 

をしかし、あなたはキーでディレクトリにアクセスすると、それを使用しているときには、一般的にソートする辞書を必要はありません。この場合、あなたは、ソートすることにより、それを行うことができます。

アップデート:私は、これらの具体的な範囲は意図的だったと思っていますが、一般的には句読点や数字をしたい場合は、この方法を試してください。

>>> import string 
>>> symbol_map = dict([(x, 0) for x in string.punctuation + string.digits]) 
>>> symbol_map.keys() 
['!', '#', '"', '%', '$', "'", '&', ')', '(', '+', '*', '-', ',', '/', '.', '1', '0', '3', '2', '5', '4', '7', '6', '9', '8', ';', ':', '=', '<', '?', '>', '@', '[', ']', '\\', '_', '^', '`', '{', '}', '|', '~'] 

あなたが未成年であるから違いは、それが例えば~含まれていますが、まだ。

+0

ありがとう、各文字のdec値を割り当てるコードは、私の範囲が私が望むシンボルセットに対して正しくないということを私に明白にしました。後で私のコードで '@'のカウントを増やそうとしました。あなたの仕事のおかげで、問題が解決されました。 –

3

私は

>>> codes = range(33,64) + range (91,96) + range(123,126) 
>>> counter = dict((chr(c), 0) for c in codes) 
>>> counter 
{'!': 0, '#': 0, '"': 0, '%': 0, '$': 0, "'": 0, '&': 0, ')': 0, '(': 0, '+': 0, '*': 0, 
'-': 0, ',': 0, '/': 0, '.': 0, '1': 0, '0': 0, '3': 0, '2': 0, '5': 0, '4': 0, '7': 0, 
'6': 0, '9': 0, '8': 0, ';': 0, ':': 0, '=': 0, '<': 0, '?': 0, '>': 0, '[': 0, ']': 0, 
'\\': 0, '_': 0, '^': 0, '{': 0, '}': 0, '|': 0} 

このような何かをするのと同じdictクラスのコンストラクタにタプルのシーケンスを渡します。各タプルの最初の要素は、マップ内の文字で、2番目の要素は0です。

これは、質問で要求されたのと同じ出力を、順不同。あなたはすでにこの出力を得ていますし、あなたのやり方は多少速いかもしれませんが、このサイズのディクテーションでは問題はありません。ジェネレータの式は一般にmapよりも優先され、dictのコンストラクタを使用するとdict.fromkeysより標準的です。私が示したやり方は、私が信じていることを少しはっきりと伝えています。すべて一緒に、私はあなたの問題が何であるか正確にはわからない。

+2

Python 3や2.7を使っているなら、 '{code in c for ch}}'(dict comprehension)も同様のことができます。 – delnan

0

Python 2.7で追加されたcollectionsモジュールのOrderedDict辞書サブクラスを使用して、キーの挿入順序を保持できます。これは、辞書がどのように表示されるかにのみ影響し、他のすべての操作は通常の辞書と同じです。それを使用すると、内容をよりはっきりと見ることができます(しかし、あなたがしていたものと同じように動作します)。

>>> symbolMap = map(chr, range(33,64) + range (91,96) + range(123,126)) 
>>> symbolMap 
['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', 
'/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', 
'=', '>', '?', '[', '\\', ']', '^', '_', '{', '|', '}'] 
>>> from collections import OrderedDict 
>>> counter = OrderedDict((chr(c),0) for c in range(33,64) + range(91,96) + range(123,126)) 
>>> counter 
OrderedDict([('!', 0), ('"', 0), ('#', 0), ('$', 0), ('%', 0), ('&', 0), 
("'", 0), ('(', 0), (')', 0), ('*', 0), ('+', 0), (',', 0), ('-', 0), 
('.', 0), ('/', 0), ('0', 0), ('1', 0), ('2', 0), ('3', 0), ('4', 0), 
('5', 0), ('6', 0), ('7', 0), ('8', 0), ('9', 0), (':', 0), (';', 0), 
('<', 0), ('=', 0), ('>', 0), ('?', 0), ('[', 0), ('\\', 0), (']', 0), 
('^', 0), ('_', 0), ('{', 0), ('|', 0), ('}', 0)]) 
>>> counter['#'] = counter['#']+1 
>>> counter 
OrderedDict([('!', 0), ('"', 0), ('#', 1), ('$', 0), ('%', 0), ('&', 0), 
("'", 0), ('(', 0), (')', 0), ('*', 0), ('+', 0), (',', 0), ('-', 0), 
('.', 0), ('/', 0), ('0', 0), ('1', 0), ('2', 0), ('3', 0), ('4', 0), 
('5', 0), ('6', 0), ('7', 0), ('8', 0), ('9', 0), (':', 0), (';', 0), 
('<', 0), ('=', 0), ('>', 0), ('?', 0), ('[', 0), ('\\', 0), (']', 0), 
('^', 0), ('_', 0), ('{', 0), ('|', 0), ('}', 0)]) 

あなたは本当にあなたが辞書を望むものを言うことはありませんが、あなたは特定の文字の発生をカウントするように、その名前と内容からそれが見えます。 Python 2.7では、collectionsモジュールには、この目的のために設計された別の新しいクラスCounterもありました。

関連する問題