Python の辞書とファイル

辞書ハッシュ テーブル

Python での効率的な Key-Value ハッシュ テーブル構造は、「dict」と呼ばれます。辞書の内容は、中かっこ { } で囲まれた一連の Key-Value ペアとして記述できます(例:dict = {key1:value1, key2:value2, ... })。「空の dict」は、中かっこ {} の空のペアです。

辞書内での値の検索や設定には角括弧を使用します。たとえば、dict['foo'] はキー「foo」の下で値が検索されます。文字列、数値、タプルはキーとして機能し、どの型も値にできます。他の型は、キーとして正しく機能する場合と正常に動作しない場合があります(文字列とタプルは不変であるため、問題なく機能します)。辞書にない値を検索すると KeyError がスローされます。「in」を使用してキーが dict にあるかどうかを確認します。または、値を返す dict.get(key) を使用し、キーが存在しない場合は None を使用します(または get(key, not-found) 場合は、見つからなかった場合に返す値を指定できます。

  ## Can build up a dict by starting with the empty dict {}
  ## and storing key/value pairs into the dict like this:
  ## dict[key] = value-for-that-key
  dict = {}
  dict['a'] = 'alpha'
  dict['g'] = 'gamma'
  dict['o'] = 'omega'

  print(dict) ## {'a': 'alpha', 'o': 'omega', 'g': 'gamma'}

  print(dict['a'])     ## Simple lookup, returns 'alpha'
  dict['a'] = 6       ## Put new key/value into dict
  'a' in dict         ## True
  ## print(dict['z'])                  ## Throws KeyError
  if 'z' in dict: print(dict['z'])     ## Avoid KeyError
  print(dict.get('z'))  ## None (instead of KeyError)

キー「a」、「o」、「g」の dict

デフォルトでは、辞書の for ループはそのキーを繰り返し処理します。鍵は任意の順序で表示されます。dict.keys() メソッドと dict.values() メソッドは、キーまたは値のリストを明示的に返します。また、(key, value) タプルのリストを返す items() もあります。これは、ディクショナリ内のすべての Key-Value データを調べる最も効率的な方法です。これらのリストはすべて sort() 関数に渡すことができます。

  ## By default, iterating over a dict iterates over its keys.
  ## Note that the keys are in a random order.
  for key in dict:
    print(key)
  ## prints a g o

  ## Exactly the same as above
  for key in dict.keys():
    print(key)

  ## Get the .keys() list:
  print(dict.keys())  ## dict_keys(['a', 'o', 'g'])

  ## Likewise, there's a .values() list of values
  print(dict.values())  ## dict_values(['alpha', 'omega', 'gamma'])

  ## Common case -- loop over the keys in sorted order,
  ## accessing each key/value
  for key in sorted(dict.keys()):
    print(key, dict[key])

  ## .items() is the dict expressed as (key, value) tuples
  print(dict.items())  ##  dict_items([('a', 'alpha'), ('o', 'omega'), ('g', 'gamma')])

  ## This loop syntax accesses the whole dict by looping
  ## over the .items() tuple list, accessing one (key, value)
  ## pair on each iteration.
  for k, v in dict.items(): print(k, '>', v)
  ## a > alpha    o > omega     g > gamma

戦略に関する注意事項: パフォーマンスの観点から、辞書は最も優れたツールの 1 つであり、データを簡単に整理するための手段として、辞書を使用すべきです。たとえば、各行が IP アドレスで始まるログファイルを読み取り、IP アドレスをキーとして使用し、その値が値として表示される行のリストを dict に格納します。ファイル全体を読み終えたら、IP アドレスを調べて行のリストをすぐに確認できます。この辞書は、分散しているデータを取り込んで、一貫性のあるものにします。

音声入力の書式設定

% 演算子は、辞書の値を名前で文字列に置換するのに便利です。

  h = {}
  h['word'] = 'garfield'
  h['count'] = 42
  s = 'I want %(count)d copies of %(word)s' % h  # %d for int, %s for string
  # 'I want 42 copies of garfield'

  # You can also use str.format().
  s = 'I want {count:d} copies of {word}'.format(h)

Del

「del」演算子は削除を行います。最も単純なケースでは、あたかも変数が定義されていない場合と同じように、変数の定義を削除できます。リスト要素またはリストスライスで Del を使用すると、リストのその部分を削除したり、エントリを辞書から削除したりすることもできます。

  var = 6
  del var  # var no more!

  list = ['a', 'b', 'c', 'd']
  del list[0]     ## Delete first element
  del list[-2:]   ## Delete last two elements
  print(list)      ## ['b']

  dict = {'a':1, 'b':2, 'c':3}
  del dict['b']   ## Delete 'b' entry
  print(dict)      ## {'a':1, 'c':3}

ファイル

open() 関数が開いて、通常の方法でファイルの読み書きに使用できるファイル ハンドルを返します。コード f = open('name', 'r') は、ファイルを開いて変数 f を開き、操作を読み取る準備を整え、終了したら f.close() を使用します。「r」ではなく、書き込みには「w」、追加には「a」を使用します。標準の for-loop は、テキスト ファイルに対して、ファイルの行を反復処理します(バイナリ ファイルではなく、テキスト ファイルに対してのみ機能します)。for ループの手法は、テキスト ファイルのすべての行を調べるためのシンプルで効率的な方法です。

  # Echo the contents of a text file
  f = open('foo.txt', 'rt', encoding='utf-8')
  for line in f:   ## iterates over the lines of the file
    print(line, end='')    ## end='' so print does not add an end-of-line char
                           ## since 'line' already includes the end-of-line.
  f.close()

一度に 1 行ずつ読み取ると、すべてのファイルが一度にメモリに収まる必要がないという優れた品質が得られます。10 GB のファイルで、10 GB のメモリを使用せずにすべての行を確認する場合に便利です。f.readlines() メソッドは、ファイル全体をメモリに読み込み、その内容を行のリストとして返します。f.read() メソッドは、ファイル全体を 1 つの文字列に読み込みます。これは、後で確認する正規表現など、テキストを一度に処理する便利な方法です。

オープンな出力ファイルにデータを書き込むには、f.write(string) メソッドを使用するのが最も簡単な方法です。または、「print(string, file=f)」のような開いているファイルで "print" を使用することもできます。

ファイル(Unicode)

Unicode でエンコードされたファイルを読み書きするには、「't'」モードを使用してエンコードを明示的に指定します。


with open('foo.txt', 'rt', encoding='utf-8') as f:
  for line in f:
    # here line is a *unicode* string

with open('write_test', encoding='utf-8', mode='wt') as f:
    f.write('\u20ACunicode\u20AC\n') #  €unicode€
    # AKA print('\u20ACunicode\u20AC', file=f)  ## which auto-adds end='\n'

段階的な開発の演習

Python プログラムを構築する際、すべてを 1 ステップで記述するのではなく、代わりに、最初のマイルストーンだけを指定します(例: 「最初のステップは単語のリストを抽出することです」)。そのマイルストーンに到達するためのコードを記述し、その時点でのデータ構造を出力するだけです。その後、sys.exit(0) を実行して、プログラムが未完了の部分に実行されないようにします。マイルストーン コードが機能したら、次のマイルストーンのコードの作業に取り掛かることができます。ある状態で変数の出力を確認できれば、次の状態に移行するために変数をどのように変換する必要があるかを考えやすくなります。Python はこのパターンで非常に高速であるため、少し変更を加えてプログラムを実行して、その動作を確認できます。迅速に処理できるため、プログラムを短いステップで構築できます。

演習: wordcount.py

文字列、リスト、辞書、タプル、ファイルなど、Python の基本的なマテリアルをすべて組み合わせて、基本の演習wordcount.py 要約の演習を試してみてください。