言語処理100本ノック 2015の挑戦記録です。環境はUbuntu 16.04 LTS + Python 3.5.2 :: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧はこちらからどうぞ。
第1章: 準備運動
###06.集合
"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,'se'というbi-gramがXおよびYに含まれるかどうかを調べよ.
出来上がったコード:
main.py
# coding: utf-8
def n_gram(target, n):
'''指定されたリストからn-gramを作成
引数:
target -- 対象リスト
n -- n-gramのn値(1ならuni-gram、2ならbi-gram...)
戻り値:
gramのリスト
'''
result = []
for i in range(0, len(target) - n + 1):
result.append(target[i:i + n])
return result
# 集合の作成
set_x = set(n_gram('paraparaparadise', 2))
print('X:' + str(set_x))
set_y = set(n_gram('paragraph', 2))
print('Y:' + str(set_y))
# 和集合
set_or = set_x | set_y
print('和集合:' + str(set_or))
# 積集合
set_and = set_x & set_y
print('積集合:' + str(set_and))
# 差集合
set_sub = set_x - set_y
print('差集合(X - Y):' + str(set_sub))
set_sub = set_y - set_x
print('差集合(Y - X):' + str(set_sub))
# 'se'が含まれるか?
print('seがXに含まれる:' + str('se' in set_x))
print('seがYに含まれる:' + str('se' in set_y))
実行結果:
端末
X:{'se', 'ap', 'pa', 'is', 'di', 'ar', 'ra', 'ad'}
Y:{'ag', 'ap', 'pa', 'ra', 'ph', 'ar', 'gr'}
和集合:{'ag', 'se', 'ap', 'pa', 'is', 'ph', 'di', 'ar', 'ra', 'gr', 'ad'}
積集合:{'ar', 'ap', 'pa', 'ra'}
差集合(X - Y):{'se', 'is', 'di', 'ad'}
差集合(Y - X):{'ph', 'gr', 'ag'}
seがXに含まれる:True
seがYに含まれる:False
n_gram()
は前問の使い回しです。
先輩方の回答には、set.union()
、 set.intersection()
、 set.difference()
を使われているものが多いですね。そちらの方が可読性が高いということですが、英語が苦手な私は|
や&
や-
の方が直感的なので、こちらにしてみました。
それにしても、こんなところでparaparaparadiseが出てくるとは^^
7本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。