エンジニアのサブルーチン

あまり注目されない組み込みのシステムエンジニアをやっています。エンジニア業界のこととか、勉強したこととかを不定期に更新していきます。

Python100本ノック 6問目

f:id:code_sugar:20190826000429p:plain

自分のコード

def ngram(n,list):
  return [list[i : i + n] for i in range(len(list) - n + 1)]

lettersX = "paraparaparadise"
lettersY = "paragraph"

X = set(ngram(2,lettersX))
Y = set(ngram(2,lettersY))

print(set.intersection(X,Y)) #積集合 set.intersection(X,Y) == X & Y
print(set.union(X,Y)) #和集合  set.union(X,Y) == X | Y
print(set.difference(X,Y)) #差集合 set.difference(X,Y) == X - Y

print("Xに'se'は含まれるか")
if 'se' in X:
  print("True")
else:
  print("False")

print("Yに'se'は含まれるか")
if 'se' in Y:
  print("True")
else:
  print("False")

反省点

そもそも('se' in X)は真偽値で返すから単純にTrueかFalseかをprintで返すんだったら、print(str('se' in X))を使えばよかった

#リファクタリング前
print("Xに'se'は含まれるか")
if 'se' in X:
  print("True")
else:
  print("False")

#リファクタリング後
print("Xに'se'は含まれるか" + str('se' in X))

後print(X&Y)のように式を直接print内に書き込んでたけどこれも可読性が悪いんでやめたほうがいいと思います。 多少コードが長くなってもいいのでここを避けていくほうがいいですね。

学んだこと

集合

set()を使うことで引数内にリストや文字列、辞書などを集合に変換する。

set('aabbccdef') #文字列を集合に変換
# ==> {a,b,c,d,e,f} #重複が削除される

set(['a','bb','ccc','a','dddd'])#リストを集合に変換
# ==> {'a','bb','ccc','dddd'}

set({"hoge": "fuga", "hogehoge": "fugafuga"})#辞書を集合に変換
# ==>{'hoge','hogehoge'} #キーのみが集合に入る。

6問目のコードでも書いてるけど。setの色々なメソッドを使うことで積集合、和集合、差集合を扱えたりする。