かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Python3 辞書のループ

他の言語ではハッシュとか連想配列と呼ばれているようなキーと値が対になったデータ構造をPythonでは辞書(dictionary)と呼ぶらしいです。(厳密にはもっと違いがあるのかもしれません)

辞書をfor inでループ

dict = {'name': 'Aki', 'age': 16, 'role': 'gunner'}
for i in dict:
  print(i, end=', ')
# => name, age, role,

for inで辞書を回すとループ内ではキーが取得される
↓下記のようにdict.keys()でループさせるのと同じっぽい

dict = {'name': 'Aki', 'age': 16, 'role': 'gunner'}
for key in dict.keys():
  print(f'key:{key} value:{dict[key]}', end=', ')
# => key:name value:Aki, key:age value:16, key:role value:gunner,

辞書の値(value)でループ

dict.values()を使う

dict = {'name': 'Aki', 'age': 16, 'role': 'gunner'}
for val in dict.values():
  print(val, end=', ')
# => Aki, 16, gunner,

キー(key)と値(value)両方でループ

dict.items()を使う

for key, val in dict.items():
  print(f'key:{key} value:{val}', end=', ')
# => key:name value:Aki, key:age value:16, key:role value:gunner,

 
辞書をループ処理する時はとりあえずdict.items()を使うのが良さそうかなと思いました。


[参考]

Python3 ループいろいろ

for

s = ''
for i in range(3):
  s += str(i)
print(i)
# => 2
print(s)
# => '012'

s = ''
# 3<= i < 10 でループ
for i in range(3, 10):
  s += str(i)
print(s)
# => '3456789'

リストをループ

s = ''
arg = ['foo', 'bar', 'buz']
for i in arg:
  s += i
print(s)
# => 'foobarbuz'

リストのインデックスは取れない

リストのインデックスを取得するループ

enumerate() を使う
enumerate(iterable, start=0) - 2. 組み込み関数 — Python 3.6.5 ドキュメント

arg = ['foo', 'bar', 'buz']
for index, val in enumerate(arg):
  print( 'arg[{0}] = {1}'.format(index, val) )
# => arg[0] = foo
# => arg[1] = bar
# => arg[2] = buz

len() でリストの要素数を取ってループ

arg = ['foo', 'bar', 'buz']
for i in range( len(arg) ):
  print( 'arg[{0}] = {1}'.format(i, arg[i]) )
# => arg[0] = foo
# => arg[1] = bar
# => arg[2] = buz

enumerate()の方がクールな感じ

while

i = 0
while i < 10:
  print(i, end=', ')
  i += 1
# => 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

breakとcontinue

break - ループから抜ける

i = 10
while i > 0:
  if i == 3:
    break
  print(i, end=", ")
  i -= 1
# => 10, 9, 8, 7, 6, 5, 4,

continue - 処理をスキップ

for i in range(10):
  if i == 3 or i == 7:
    continue
  print(i, end=', ')
# => 0, 1, 2, 4, 5, 6, 8, 9,

複数のリストを同時にループで回す

zip

zip(*iterables)
それぞれのイテラブルから要素を集めたイテレータを作ります。

この関数はタプルのイテレータを返し、その i 番目のタプルは引数シーケンスまたはイテラブルそれぞれの i 番目の要素を含みます。このイテレータは、入力イテラブルの中で最短のものが尽きたときに止まります。
出典: zip(*iterables) - 2. 組み込み関数 — Python 3.6.5 ドキュメント

リストの要素数が異なる時は最も要素が少ないリスト長でのループになる

names = ['Mika', 'Aki', 'Mikko']
ages = [18, 17, 16]
for name, age in zip(names, ages):
  print(name, age)
# => Mika 18
# => Aki 17
# => Mikko 16

roles = ['boss', 'gunner', 'driver', 'correspondent']
for name, role, age in zip(names, roles, ages):
  print(name, role, age)
# => Mika boss 18
# => Aki gunner 17
# => Mikko driver 16

zip_longest

tertools.zip_longest(*iterables, fillvalue=None)
各 iterable の要素をまとめるイテレータを作成します。iterable の長さが違う場合、足りない値は fillvalue で埋められます。最も長い itarable が尽きるまでイテレーションします。
出典: itertools.zip_longest(*iterables, fillvalue=None) - 10.1. itertools — 効率的なループ実行のためのイテレータ生成関数 — Python 3.6.5 ドキュメント

異なるリストの要素数が異なる時、足りない要素を任意の値で埋めて最も長い要素数でループすることができる

from itertools import zip_longest

names = ['Mika', 'Aki', 'Mikko']
ages = [18, 17, 16]
roles = ['boss', 'gunner', 'driver', 'correspondent']

for name, role, age in zip_longest(names, roles, ages, fillvalue = '---'):
  print(name, role, age)
# => Mika boss 18
# => Aki gunner 17
# => Mikko driver 16
# => --- correspondent ---

fillvalueで埋める値を指定しない場合はNoneが出力される

from itertools import zip_longest が無くてもPython v3.6.5だとエラーにならなかったので、このimportが必要なのかどうか不明

ループ - else

ループにelse節を続けるとelse節の中がループの終了時に実行される

for i in range(10):
  if i == 3 or i == 7:
    continue
  print(i, end=', ')
else:
  print("loop end!")
# => 0, 1, 2, 4, 5, 6, 8, 9, loop end!

↓ 下記と実質的に同じ気が....

for i in range(10):
  if i == 3 or i == 7:
    continue
  print(i, end=', ')
print("loop end!")
# => 0, 1, 2, 4, 5, 6, 8, 9, loop end!

ループ後のelseの使いみちがイマイチ謎ぃ

ハッシュ?辞書?のループはまた今度。


[参考]

Python3 print でシンタックスエラーになった。

ヲタクなのでPaizzaのすみぺ(上坂すみれ)コラボにつられてPython入門しました。

コミケ時期にキャンペーンするのヤメて!! 原稿と被って出来ないの!! 各位ヨロシクオネガイシマス

超初心者なのでprintシンタックスエラーを出してしまいました。

print で Missing parentheses in call to 'print' エラー

print 'Hello すみぺ!'
# => SyntaxError: Missing parentheses in call to 'print'.

Python3からprintの書き方が変更になった

Python3からはprint()で実行しないとエラーになるようです。

# python3
print('Hello すみぺ!')
# => Hello すみぺ!

ググるPython 2xの時の記事もいっぱい出てくるので、学習するにあたってPthon3になって互換性がなくなった部分ハマっていきそうな予感です...

と、マークダウンに<small>が書ける記法が欲しい。


初めてのコンピュータサイエンス

初めてのコンピュータサイエンス