今回はPythonの小ネタを
集めてみました。
解説動画はこちら
Pythonの文法を覚えていない方は
動画講座があるのでそちらを見ていただくと
Pythonの基礎文法を抑えることができます。
5時間で学ぶプログラミング基礎 (python編)
また、こういうよく使う文を集めた
チートシートも販売していますので
よろしければコチラを見てみてください。
note
Pythonチートシート
さて
まず最初の小ネタは三項演算子です。
Pythonには三項演算子は無いですが
if文で代用できます。
変数 = 値 if 条件式 else 値
続いて
内包書式を使った条件分岐
4
4
Filterでも同様の操作ができます。
4
難しい条件をFor文で用いるなら
Filterを活用できます。
先に関数を用意しておいて
bool型の値を返すようにしておきます。
3
4
6
8
9
続いて
多重リストのソートです。
sortedを用いるとソートできますが
1番目の値でのソートになっています。
多重リストの値を使っての
並び替えは次のようにして行えます。
多重リストの値での並び替え
sorted(リスト等,key=lambda x:x[インデックス]):
デフォルトは昇順
降順はreverse=Trueを加える
リストの2番目の値で昇順ソート
リストの3番目の値で降順ソート
さらに多重データの並び替えです。
このような辞書型のデータを用意しました。
ここでも
key=lambda x:x[インデックス]
の部分を変えることで
多重データの値を用いた
ソートを行えうことができます。
pの値で降順ソート
sの値で降順ソート(文字列はintに変換)
aの2個目の値で降順ソート
キーでの降順ソート
キーでの降順ソート
pの値で昇順ソート
enumerateを便利に使う
for文などでインデックスを付与出来ます。
Indexの初めの値を設定するには
start=値のオプションをつけます。
カウントの代わりに使う(1行分スマートに)
b
d
リストのコピーでの誤り
Pythonのリストをコピーしようとして
次のようなコードを書くことがあります。
片方の変数の中身を変えると
どうなるでしょうか?
値をコピーして
新しいものを作成したい場合は
[1, 2, 3]
分数計算(Fraction)
分母分子、文字列などで
分数計算が行えます。
1/6
0.16666666666666666
分母と分子の値も取れます。
有効桁数
Pythonでは
/ は割り算を行うことができますが
/と//では演算方法が変わります。
499999998500000001
/はdouble演算
//はint演算になるため
精度が変わります。
大きな計算を行う場合は
注意が必要です。
順列、組み合わせ
Pythonでは組み合わせの計算も
簡単に行うことができます。
itertoolsを用います。
階乗(factorical)を求める
順列(permutations)
配列の中からN個を取り出して並べる
(順序も関係あり)
組み合わせ(combinations)
配列の中からN個を取り出して並べる
(順序を無視)
('a', 'c', 'd', 'e'), ('b', 'c', 'd', 'e')]
また
こういう小ネタの需要があれば
やっていきたいと思います。
それでは。
集めてみました。
解説動画はこちら
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+=1a
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を参照した結果と同等になります。
単純に参照となるため
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')]
また
こういう小ネタの需要があれば
やっていきたいと思います。
それでは。
コメントする