Python_配列や辞書をワンライナーで操作してみる #275日目
【一言日記】
長く対応していた自社ツールのプチ改良に、対応完了の目途が立ってきました。JavaScriptを一から学びながらだったので大変でしたが、色々分かるようになって良かったです。
Pythonでのワンライナーな記述方法について整理しておきます。
if文とfor文での記述方法です。
ただ、両者ともどこでも使用できるわけではないので、使える場所を見極めて使う必要があります。
まずfor文のワンライナーな書き方です。listの中で使用することができます。
[繰り返す処理 for 要素 in 配列]
2つの配列をマージしつつ、それぞれの配列の内容を抽出するという謎の処理をしています。
arrays = []
a = [6, 5, 4, 3, 2, 1]
b = [3, 1, 8, 8, 1, 3]
arrays += [a, b]
[print(" ".join(map(str, array))) for array in arrays]
// 出力結果
6 5 4 3 2 1
3 1 8 8 1 3
次にif文のワンライナーな書き方です。これは以前の記事でも触れさせていただきました。
Trueな場合の値 if 条件式 else Falseな場合の値
値を返すことしかできず、処理は記述できないのが特徴でした。
先ほどのfor文のワンライナーと組み合わせて使ってみます。
数字の配列a,b,cを1つの配列としてマージして、2列目の3つ目の要素 (bの3)を出力する謎の処理です。
arrays = []
a = "1 2 3".split()
b = "8 1 3".split()
c = "10 100 1".split()
arrays += [a, b, c]
[print(arrays[i][j]) for i in range(len(arrays)) if i == 1 for j in range(len(arrays[i])) if j == 2]
// 出力結果
3
for文のワンライナーは辞書でも使うことができます。2つの配列の一方をキーに、もう一方をバリューに設定する処理です。
keys = ['A', 'B', 'C']
values = [111, 222, 333]
d = {key: value for key, value in zip(keys, values, strict=True)}
print(d)
// 出力結果
{'A': 111, 'B': 222, 'C': 333}
こちらもif文を組み合わせて使えます。
上記の辞書で、バリューが150より大きいものだけで新たな辞書を作成しています。
big_d = {key: value for key, value in d.items() if value > 150}
print(big_d)
// 出力結果
{'B': 222, 'C': 333}
ちょっと脱線気味ですが、JSON形式の中にある配列に対しても同様の記述が可能です。
api = [{'id': 10000, 'feature': {'name': 'Michael', 'height': 180.3, 'weight': 63.7, 'skills': {'IT': ['Python', 'Golang', 'SQL'], 'Others': ['Chinese', 'Math']}}},
{'id': 10001, 'feature': {'name': 'Nancy', 'height': 156.7, 'weight': 39.7, 'skills': {'IT': ['Java', 'SQL', 'JavaScript'], 'Others': ['Accounting']}}}]
it_skills = [person['feature']['skills']['IT'] for person in api]
a, b = it_skills
common_skill = set(a) & set(b)
print(common_skill)
// 出力結果
{'SQL'}
ここまでお読みいただきありがとうございました!!