LoginSignup
7
6

More than 5 years have passed since last update.

perl使いのpythonメモ - 辞書型(大文字小文字無効)

Posted at
  • pythonのjoinであれ?とおもったことをメモしときます。

perlでいうとこのhashです。

  • hashのキーが大文字でも小文字でもいいってのがあるそうです。便利ですね。
  • 素のpythonじゃなくてモジュールなんですけどね。CaseInsensitiveDictという名前だそうです。
  • 事前にpip install requestsでモジュールをインストールしておいてください。
>>> from requests.structures import CaseInsensitiveDict
>>> cid = CaseInsensitiveDict({'Apple': 'osx', 'NeXT': 'STEP'})
>>> cid
{'Apple': 'osx', 'NeXT': 'STEP'}
>>> cid['apple']
'osx'
>>> cid['APPLE']
'osx'
>>> cid['next']
'STEP'
>>> cid['nEXT']
'STEP'
  • うむ便利!

キーがないとエラー

  • perlだとhashにないと””が戻ってきますがpythonだとエラーが出ちゃうんですね。(めんどい...)
>>> cid['microsoft']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "〜〜/python3.5/site-packages/requests/structures.py", line 54, in __getitem__
    return self._store[key.lower()][1]
KeyError: 'microsoft'
  • 怒られました...

キーの存在確認

  • キーの存在確認をするには、in演算子とhas_keyメソッドが使えるようですが...
  • CaseInsensitiveDictだと制約があるようです。
  • has_keyは用意されてませんでした。
has_key
>>> cid.has_key('microsoft')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'CaseInsensitiveDict' object has no attribute 'has_key'
  • inなら平気です。
in
>>> 'microsoft' in cid
False
>>> 'apple' in cid
True
>>> 'Apple' in cid
True

perlなら...

  • Hash::Case::Preserveというモジュールを使います。
  • こちらはキーがないときの挙動も素のhashと変わらないようですね。
cid.pl
use Hash::Case::Preserve;
tie my(%cid),'Hash::Case::Preserve';
$cid{'NeXT'} = 'STEP';
$cid{'Apple'} = 'osx';
print $cid{'next'};
print $cid{'APPLE'};
print $cid{'microsoft'};
print keys %cid
sh-3.2$ perl -l cid.pl 
STEP
osx

AppleNeXT
7
6
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6