見出し画像

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'}


ここまでお読みいただきありがとうございました!!


参考


いいなと思ったら応援しよう!