Python: リストをループで処理する
リストをループで処理する
課題
リストをループで処理する際に、ループに使用しているリストの要素を削除すると、削除した要素の次の要素がスキップされる。
例えば、以下を実行すると、
# リストの要素を表示
list1 = [6, 1, 8, 0, 3]
print("リストの要素を表示")
for item in list1:
print(item)
以下のようになる。これは想定通り。
・実行結果
リストの要素を表示
6
1
8
0
3
しかし、以下を実行すると、
# リストの要素を削除すると、次の要素が飛ばされる
print("リストの要素を表示: 途中で要素を削除すると、その次の要素が表示されない。(この例だと 8 が処理されない)")
list1 = [6, 1, 8, 0, 3]
for item in list1:
print(item)
if item == 1:
list1.remove(item)
print("リストの全要素を表示: 想定通り 1 は削除された")
print(list1)
・実行結果
リストの要素を表示: 途中で要素を削除すると、その次の要素が表示されない。(この例だと 8 が処理されない)
6
1
0
3
リストの全要素を表示: 想定通り 1 は削除された
[6, 8, 0, 3]
想定とは異なり、上記のように削除した "1" の次の "8" がループに含まれないため、完全な処理ができない。
ちなみに、以下を実行しても、全ての要素を削除することはできない。remove() すると、次の要素がループに含まれないためである。
# リストの要素を全削除するつもりでやってみてもうまくいかない
print("リストの要素を表示: リストの要素を全削除したいと思ってもスキップされるのでうまくいかない")
list1 = [6, 1, 8, 0, 3]
for item in list1:
print(item)
list1.remove(item)
print("削除は 1つ飛ばしで行われる。従って、1 と 0 が残ってしまう")
print(list1)
・実行結果
リストの要素を表示: リストの要素を全削除したいと思ってもスキップされるのでうまくいかない
6
8
3
削除は 1つ飛ばしで行われる。従って、1 と 0 が残ってしまう
[1, 0]
対応案
ループ用と処理用の 2つのリストを用意し、処理用ループで要素の削除をすることで、リストの全要素が処理対象となるようにする。以下の例では、list1 がループ用で list2 が処理用である。
# 対応案1: ループ用とは別にリストを用意し、数値の処理はそのリストで行う
import copy
# 配列初期化
list1 = [6, 1, 8, 0, 3]
# list のコピーには、copy.copy を使う。普通に代入すると、同一のリストを参照してしまう。
list2 = copy.copy(list1)
print("ループを list1 で行い、数値の処理は list2 で行う")
for item in list1:
print(item)
if item == 1:
# print("数値処理は list2 で行う")
list2.remove(item)
print("リスト1 の全要素を表示", end="")
print(list1)
print("リスト2 の全要素を表示", end="")
print(list2)
・実行結果
ループを list1 で行い、数値の処理は list2 で行う
6
1
8
0
3
リスト1 の全要素を表示[6, 1, 8, 0, 3]
リスト2 の全要素を表示[6, 8, 0, 3]
Python: リストのコピー
リストのコピー
課題
リストを変数に代入すると、参照先が同一となるため、別々の処理をすることができない。
list1 = [6, 1, 8, 0, 3]
# list2 へ list1 を代入する
list2 = list1
# list1 と list 2 の値
print(list1, list2)
# list1 と list 2 の参照先: 同一のアドレスであることが分かる
print(id(list1), id(list2))
出力結果: 2行目の id() の結果が同じ値になっている
[6, 1, 8, 0, 3] [6, 1, 8, 0, 3]
2536087841792 2536087841792
対応案
copy.copy() を使うと、別のリストを生成することができる。
# copy.copy でリストをコピーした場合
list2 = copy.copy(list1)
# list1 と list 2 の値
print(list1, list2)
# list1 と list 2 の参照先: 別々のアドレスであることが分かる
print(id(list1), id(list2))
出力結果: 格納されている値は同じだが、id() の結果が異なる。つまり、別々のリスト
[6, 1, 8, 0, 3] [6, 1, 8, 0, 3]
2536087841792 2536087817728
2分木探索
## 2分木探索 (Python)
# coding: utf-8
def binary_search(keyword, list1):
# list1 に keyword に合致するものがあるかを 2分木探索で検索する
# list1 をソートする
list1.sort()
# index を設定
index_low = 0
index_high = len(list1) - 1
flag = 0
while index_low <= index_high:
index_mid = index_low + ((index_high - index_low) // 2)
guess = list1[index_mid]
if guess == keyword:
flag = 1
break
elif guess > keyword:
index_high = index_mid - 1
elif guess < keyword:
index_low = index_mid + 1
if flag == 1:
print("exist")
else:
print("not exist")
# 処理開始
list_a = [1, 5, 2, 4, 3]
keyword_a = 30
print(len(list_a))
binary_search(keyword_a, list_a)
Python: for 文
for 文について
for と range()
range(<回数>) は、指定された <回数> 分数値を生成する。range で出力される値は "0" から始まるので、配列と組み合わせやすい。
num = 5
for i in range(num):
print(i)
出力結果
0
1
2
3
4
## リストを要素に持つリストの引き算
## リストを要素に持つリスト (e.g. [[-8, 7, 6], [-5, 0, -1], [3, 6, -9]])
for i in range(l - 1):
a = cmblist[i]
b = cmblist[i + 1]
c = []
# 要素内のリストを取り出し、さらにそのリストの要素を1つずつ取り出して計算する。
# 前提として、m には、要素内のリストの要素数が格納されている
for i2 in range(m):
c.append(b[i2] - a[i2])
print(c)
## 要素がリスト内のどの場所に格納されているかを検索する
# 要素がリスト内のどの場所に格納されているかを検索する方法
# list_a.index(c) で、list_a に c がある場合、その添え字を返す
print(list_a.index(c) + 1)
Python: キーボードの入力を表示する
キーボードからの入力を受け付けて表示するには、input() を使います。
・コード
word = input()
print("入力文字 = " + word)
print("データ型 = " + str(type(word)))
・実行例
PS D:\sample> .\sample1.py
test <--- キーボードで入力した文字列
入力文字 = test
データ型 = <class 'str'>
PS D:\sample>
数値を受け取る場合
input() で受け取った値は文字列になっているので、数値の入力を受けて計算をする場合には、int()などでデータ型を返還する必要があります。
e.g. 型変換の例: リスト内包表記(List comprehensions)を使った場合
a,b,c = [int(x) for x in input().split()]
print(a, b, c)
出力結果
3 5 9
3 5 9
Windows 11 のサポート期間が 24ヶ月、36ヶ月になるそうです
WIndows 11 の機能更新プログラムは、これから1年に1回のリリースになるらしいです。サポート期間も 6ヶ月長くなって、Home, pro で 24か月、Enterprise が 36ヶ月になるそうです。
Pro を採用している企業にとってはメリットが大きいと思います。これまでだと、新しい Windows がリリースされたから半年で検証と社内展開をしなければならなかったわけですが、それだと実質サポート期間内の展開はできなかったのでは ? と思います。
もともとの期間が短すぎたと思うところはありますが、いずれにしろサポート期間が延びることで少しは社内展開に余裕が持てるかと思います。
・Windows 11 のライフサイクル