- 1. 概要
- 2. 初期化
- 3. 全件
- 4. 2番目から
- 5. ループしながら配列の項目を削除
- 6. 多重ループをぬける
- 7. 追加
- 8. ソート
- 9. スワップ
1. 概要
わたしの気になっているとこだけね。
本ページは、下記のサイトを参考にさせていただきました。
「Python でリストをソートする sort と sorted の違い」
「説明のないとってもシンプルなサンプルプログラム集」
「[小ネタ]Pythonのループ内でリストの要素を削除する時の注意点」
「Pythonで変数やリストの値を入れ替え(交換・並べ替え)」
2. 初期化
型はないのでね。
variables = []
上記で「variable」は、単なる変数なので、お間違えなきよう。
3. 全件
配列の要素を全件取得するループを書くのは、こんな感じ。
list = [ 'hoge', 'fuga', 'piyo' ]
for item in list:
print(item)
4. 2番目から
前項のものを2番目以降取得するループを書くのは、こんな感じ。
array = [ 'hoge', 'fuga', 'piyo' ]
for item in array[1:]:
print(item)
5. ループしながら配列の項目を削除
これは、配列のオブジェクトを扱うときに、いつも問題になることなのですが・・・。
配列の全件ループを行っているときに、配列自体を操作しようとすると、そのループが正常に回っていくかという命題です。
import pprint
pp = pprint.PrettyPrinter()
list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
pp.pprint(list)
for i in list:
if (not (i % 3)):
list.remove(i)
pp.pprint(list)
for i in list:
list.remove(i)
pp.pprint(list)
を実行すると
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 7, 8, 10]
[2, 5, 8]
てなことになる。
1 から 10 までの値の入っている配列で、9~11 で、3の倍数を削除してますが、なんかうまくいったように見えます。
しかし、調子にのって全件削除しちゃおうと 15~16行を実行すると、1つ飛ばしで残ってしまう。
ループ中に、中身が削除されたために、カウンタがずれちゃって削除した次のカウントの処理を飛ばしちゃうんですな。
3の倍数だと、飛ばした次は、3の倍数ではないので、気が付かないということになります。
これを解決するには、
import pprint
pp = pprint.PrettyPrinter()
list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
pp.pprint(list)
for i in list[:]:
if (not (i % 3)):
list.remove(i)
pp.pprint(list)
for i in list[:]:
list.remove(i)
pp.pprint(list)
というような書き方をするとよいそうです。
「配列[:]」で、オブジェクトのコピーを使うそうです。
これを辞書型でやろうとすると書き方がわからない。
今んとこ、全部のキーを削除してやろうと思うと、わたしには、下記のような書き方しかできません。
import pprint
pp = pprint.PrettyPrinter()
dic = {
1 : 1,
2 : 2,
3 : 3,
4 : 4,
5 : 5,
6 : 6,
7 : 7,
8 : 8,
9 : 9,
10 : 10,
}
pp.pprint(dic)
for i in list(dic):
del dic[i]
pp.pprint(dic)
6. 多重ループをぬける
本項は、「Pythonで多重ループ(ネストしたforループ)からbreak | note.nkmk.me」を参考にさせていただきました。
多重ループを抜けるには、他の言語では、フラグを使って外のループで判定したり、メソッドや関数を作って、一気にリターンしたりしますが。
「Python」では、「break」「else:」「continue」を組み合わせると一気に抜けられるようです。
「for 文」内で、「else」中のがなじめないですが、なかなか便利。
ただし、わたしは、くっきりは理解できていない(2020年6月10日)。
for i in range(1, 5):
print("外側のループ", i)
for j in range(6, 10):
print("内側のループ", i, j)
if (j == 8):
break
else:
continue
break
というソースを書いて実行すると、下記の結果が得られます。
外側のループ 1
内側のループ 1 6
内側のループ 1 7
内側のループ 1 8
うすらぼんやりとは、理解できます。
三重になると、頭がこんがらがってくる。
for i in range(1, 5):
print("外側のループ", i)
for j in range(6, 10):
print("内側のループ", i, j)
for k in range(11, 15):
print("内側のループ", i, j, k)
if (k == 13):
break
else:
continue
break
else:
continue
break
というソースを書いて実行すると、下記の結果が得られます。
外側のループ 1
内側のループ 1 6
内側のループ 1 6 11
内側のループ 1 6 12
内側のループ 1 6 13
各ネストに「break」「else:」「continue」が必要らしい。
7. 追加
配列に要素を追加するには、「append」という、メソッドを使います。
variables.append(追加要素)
8. ソート
ソートは
variables.sort()
variables.sorted()
「sort」は、戻り値は「None」で、配列自体をソートします。
「sorted」は、戻り値が元の配列をソートした配列で、元の配列はソートされません。
9. スワップ
配列の中の値を入れ替える、スワップ。
既存の言語では、第三者となるワーク変数をつくって、いったん退避後、入れ替えるという手法を取ります。
その点、「python」は、比較的新しい言語であるためか、スワップ用の構文を持っています。
例えば、配列の1番目と3番目を入れ替える際は
l[0], l[2] = l[2], l[0]
と、一つの文で表現できます。
|