今回はPythonの小ネタを
集めてみました。

解説動画はこちら


Pythonの文法を覚えていない方は
動画講座があるのでそちらを見ていただくと
Pythonの基礎文法を抑えることができます。

5時間で学ぶプログラミング基礎 (python編)

また、こういうよく使う文を集めた
チートシートも販売していますので
よろしければコチラを見てみてください。

note
Pythonチートシート

さて
まず最初の小ネタは三項演算子です。

Pythonには三項演算子は無いですが
if文で代用できます。
condition = True
if condition:
    x = 0
else:
    x = 1
print(x)
0

変数 = 値 if 条件式 else 値
# 条件式
condition = False
# 変数 = 値 if 条件式 else 値
x = 0 if condition else 1
print(x)
1

続いて
内包書式を使った条件分岐
data = [1,2,3,4,5]
for d in data:
    if d %2 ==0:
        print(d)
2
4

data = [1,2,3,4,5]

for d in [a for a in data if a %2 ==0]:
    print(d)
2
4

Filterでも同様の操作ができます。
data = [1,2,3,4,5]
for d in filter(lambda x:x %2 ==0, data):
    print(d)
2
4


難しい条件をFor文で用いるなら
Filterを活用できます。

先に関数を用意しておいて
bool型の値を返すようにしておきます。

data = [1,2,3,4,5,6,7,8,9]
def def1(num):
    if num%2==0 or num%3==0:
        return True
    else:
        return False
for d in filter(def1, data):
    print(d)
2
3
4
6
8
9

続いて
多重リストのソートです。
data =[[1,3,8],[9,5,4],[2,6,7]]
for d in sorted(data):
    print(d)
[1, 3, 8]
[2, 6, 7]
[9, 5, 4]

sortedを用いるとソートできますが
1番目の値でのソートになっています。

多重リストの値を使っての
並び替えは次のようにして行えます。

多重リストの値での並び替え
sorted(リスト等,key=lambda x:x[インデックス]):

デフォルトは昇順
降順はreverse=Trueを加える

リストの2番目の値で昇順ソート
data =[[1,3,8],[9,5,4],[2,6,7]]
for d in sorted(data,key=lambda x:x[1]):
    print(d)
[1, 3, 8]
[9, 5, 4]
[2, 6, 7]

リストの3番目の値で降順ソート
data =[[1,3,8],[9,5,4],[2,6,7]]
for d in sorted(data,key=lambda x:x[2],reverse=True):
    print(d)
[1, 3, 8]
[2, 6, 7]
[9, 5, 4]


さらに多重データの並び替えです。
このような辞書型のデータを用意しました。
import collections
from collections import OrderedDict

Adic = {'C134':{"p":30,"s":"1000","r":200,"a":[110,20,35,50]}, 
              'C623':{"p":80,"s":"1100","r":600,"a":[100,10,30,52]},
              'C430':{"p":70,"s":"5000","r":100,"a":[160,11,12,61]},
              'C115':{"p":10,"s":"2400","r":400,"a":[180,15,10,67]}}

ここでも
key=lambda x:x[インデックス]
の部分を変えることで
多重データの値を用いた
ソートを行えうことができます。


pの値で降順ソート
# pの値で降順ソート
res1 = sorted(Adic.items(), key=lambda x: x[1]['p'],reverse=True)
for a in res1:print(a)
('C623', {'p': 80, 's': '1100', 'r': 600, 'a': [100, 10, 30, 52]})
('C430', {'p': 70, 's': '5000', 'r': 100, 'a': [160, 11, 12, 61]})
('C134', {'p': 30, 's': '1000', 'r': 200, 'a': [110, 20, 35, 50]})
('C115', {'p': 10, 's': '2400', 'r': 400, 'a': [180, 15, 10, 67]})


sの値で降順ソート(文字列はintに変換)
# sの値で降順ソート(文字列はintに変換)
res2 = sorted(Adic.items(), key=lambda x: int(x[1]['s']),reverse=True)
for a in res2:print(a)
('C430', {'p': 70, 's': '5000', 'r': 100, 'a': [160, 11, 12, 61]})
('C115', {'p': 10, 's': '2400', 'r': 400, 'a': [180, 15, 10, 67]})
('C623', {'p': 80, 's': '1100', 'r': 600, 'a': [100, 10, 30, 52]})
('C134', {'p': 30, 's': '1000', 'r': 200, 'a': [110, 20, 35, 50]})


aの2個目の値で降順ソート
# aの2個目の値で降順ソート
res3 = sorted(Adic.items(), key=lambda x: x[1]['a'][1],reverse=True)
for a in res3:print(a)
('C134', {'p': 30, 's': '1000', 'r': 200, 'a': [110, 20, 35, 50]})
('C115', {'p': 10, 's': '2400', 'r': 400, 'a': [180, 15, 10, 67]})
('C430', {'p': 70, 's': '5000', 'r': 100, 'a': [160, 11, 12, 61]})
('C623', {'p': 80, 's': '1100', 'r': 600, 'a': [100, 10, 30, 52]})


キーでの降順ソート
# キーでの降順ソート(後ろから3つで数字を抜く。3ケタとか固定の場合)
res4 = sorted(Adic.items(), key=lambda x: int(x[0][-3]) ,reverse=True)
for a in res4:print(a)
('C623', {'p': 80, 's': '1100', 'r': 600, 'a': [100, 10, 30, 52]})
('C430', {'p': 70, 's': '5000', 'r': 100, 'a': [160, 11, 12, 61]})
('C134', {'p': 30, 's': '1000', 'r': 200, 'a': [110, 20, 35, 50]})
('C115', {'p': 10, 's': '2400', 'r': 400, 'a': [180, 15, 10, 67]})


キーでの降順ソート
# キーでの昇順ソート(先頭の文字 C をカットした数値で)
res5 = sorted(Adic.items(), key=lambda x: int(x[0].lstrip('C')))
for a in res5:print(a)
('C115', {'p': 10, 's': '2400', 'r': 400, 'a': [180, 15, 10, 67]})
('C134', {'p': 30, 's': '1000', 'r': 200, 'a': [110, 20, 35, 50]})
('C430', {'p': 70, 's': '5000', 'r': 100, 'a': [160, 11, 12, 61]})
('C623', {'p': 80, 's': '1100', 'r': 600, 'a': [100, 10, 30, 52]})


pの値で昇順ソート
# pの値で昇順ソート(OrderedDict使用)
res6 = OrderedDict(sorted(Adic.items(), key=lambda x: x[1]['p']))
for a,b in res6.items():print(a,b)
C115 {'p': 10, 's': '2400', 'r': 400, 'a': [180, 15, 10, 67]}
C134 {'p': 30, 's': '1000', 'r': 200, 'a': [110, 20, 35, 50]}
C430 {'p': 70, 's': '5000', 'r': 100, 'a': [160, 11, 12, 61]}
C623 {'p': 80, 's': '1100', 'r': 600, 'a': [100, 10, 30, 52]}


enumerateを便利に使う

for文などでインデックスを付与出来ます。
data = ['a','b','d','e','c']
for i,d in enumerate(data):
    print(i,d)
0 a
1 b
2 d
3 e
4 c


Indexの初めの値を設定するには
start=値のオプションをつけます。
data = ['a','b','d','e','c']
for i,d in enumerate(data,start=10):
    print(i,d)
10 a
11 b
12 d
13 e
14 c


カウントの代わりに使う(1行分スマートに)
data = ['a','b','d','e','c']

count = 0
for d in data:
    print(d)
    if count>1:
        break
    count+=1
a
b
d
data = ['a','b','d','e','c']
##count=0
for i,d in enumerate(data):
    print(i,d)
    if i>1:
        break
    ## count+=1
0 a
1 b
2 d


リストと組み合わせて辞書を作る
# インデックスをキーにする
data = ['a','b','d','e','c']
data_dict = {k:v for k,v in enumerate(data)}
print(data_dict)
{0: 'a', 1: 'b', 2: 'd', 3: 'e', 4: 'c'}
# リストの値をキーにする
data = ['a','b','d','e','c']
data_dict = {v:k for k,v in enumerate(data)}
print(data_dict)
{'a': 0, 'b': 1, 'd': 2, 'e': 3, 'c': 4}


リストのコピーでの誤り
Pythonのリストをコピーしようとして
次のようなコードを書くことがあります。
a = [1,2,3]
b = a

print(a)
print(b)
[1, 2, 3]
[1, 2, 3]

片方の変数の中身を変えると
どうなるでしょうか?
a = [1,2,3]
b = a
a[1] = 9

print(a)
print(b)
[1, 9, 3]
[1, 9, 3]

リスト型の変数を代入すると
単純に参照となるため
bはaを参照した結果と同等になります。

値をコピーして
新しいものを作成したい場合は
リスト.copy()を使用する必要があります。
a = [1,2,3]
b = a.copy()
a[1] = 9

print(a)
print(b)
[1, 9, 3]
[1, 2, 3]


分数計算(Fraction)
分母分子、文字列などで
分数計算が行えます。
from fractions import Fraction

x = Fraction(1, 6)
print(x)

y = Fraction('1/6')
print(y)

print(1/6)
1/6
1/6
0.16666666666666666

分母と分子の値も取れます。
print(x.numerator)
print(x.denominator)



有効桁数

Pythonでは
/ は割り算を行うことができますが
/と//では演算方法が変わります。

n = 999999999

print(int(n * (n-1) /  2))
print(int(n * (n-1) // 2))
499999998500000000
499999998500000001

/はdouble演算
//はint演算になるため
精度が変わります。

大きな計算を行う場合は
注意が必要です。



順列、組み合わせ
Pythonでは組み合わせの計算も
簡単に行うことができます。

itertoolsを用います。


階乗(factorical)を求める
import math
import itertools

print(math.factorial(6))
720

順列(permutations)
配列の中からN個を取り出して並べる
(順序も関係あり)
seq = ('a', 'b', 'c', 'd', 'e')
n = 5
per = list(itertools.permutations(seq,n))
print(len(per))
120
seq = ('a', 'b', 'c', 'd', 'e')
n = 3
per = list(itertools.permutations(seq, n))
print(len(per))
60


組み合わせ(combinations)
配列の中からN個を取り出して並べる
(順序を無視)
seq = ('a', 'b', 'c', 'd', 'e')
n = 5
combi = list(itertools.combinations(seq,n))
print(combi)
[('a', 'b', 'c', 'd', 'e')]
seq = ('a', 'b', 'c', 'd', 'e')
n = 4
combi = list(itertools.combinations(seq,n))
print(combi)
[('a', 'b', 'c', 'd'), ('a', 'b', 'c', 'e'), ('a', 'b', 'd', 'e'),
('a', 'c', 'd', 'e'), ('b', 'c', 'd', 'e')]


また
こういう小ネタの需要があれば
やっていきたいと思います。

それでは。