質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

288閲覧

Classの利用について

yu__

総合スコア108

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/03 15:03

Classの利用について

自作でngramの関数を作成し、そのngramから生成されたリストから同様のものをすべて消すためにget_unique_listなる関数を使って以下のリストを変換しました。

python

1abc = 'ppppaaappff' 2 3def ngram(list05,n): 4 list05_new = [] 5 for i in range(len(list05)-n+1): 6 a = [] 7 for k in range(n): 8 a += list05[i+k] 9 list05_new.append(a) 10 return list05_new 11 12print(ngram(abc,2))

結果

[['p', 'p'], ['p', 'p'], ['p', 'p'], ['p', 'a'], ['a', 'a'], ['a', 'a'], ['a', 'p'], ['p', 'p'], ['p', 'f'], ['f', 'f']]

python

1def get_unique_list(seq): 2 seen = [] 3 return [x for x in seq if x not in seen and not seen.append(x)] 4print(get_unique_list(ngram(abc,2)))

結果

[['p', 'p'], ['p', 'a'], ['a', 'a'], ['a', 'p'], ['p', 'f'], ['f', 'f']]

この二つの関数を二つが独立して存在していると使いにくいと考えたのでClassを用いて一つにしたいと考えました。

python

1class ngram_unique_list(): 2 def __init__(self,data): 3 self.data = data 4 5 def ngram(self,n): 6 data_new = [] 7 for i in range(len(self.data)-n+1): 8 a = [] 9 for k in range(n): 10 a += self.data[i+k] 11 data_new.append(a) 12 return data_new 13 14 def get_unique_list(self): 15 seen = [] 16 return [x for x in ngram(self,n) if x not in seen and not seen.append(x)] 17 18abc = 'ppppaaappff' 19a = ngram_unique_list(abc) 20a.ngram(2)

結果

[['p', 'p'], ['p', 'p'], ['p', 'p'], ['p', 'a'], ['a', 'a'], ['a', 'a'], ['a', 'p'], ['p', 'p'], ['p', 'f'], ['f', 'f']]

しかし、以下のようなコードを実行すると以下のようなエラーを吐かれてしまいます。

python

1a.get_unique_list()

結果

--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-59-632d6aa19c2f> in <module>() 18 abc = 'ppppaaappff' 19 a = ngram_unique_list(abc) ---> 20 a.get_unique_list() <ipython-input-59-632d6aa19c2f> in get_unique_list(self) 14 def get_unique_list(self): 15 seen = [] ---> 16 return [x for x in ngram(self,n) if x not in seen and not seen.append(x)] 17 18 abc = 'ppppaaappff' NameError: name 'n' is not defined

正直おかしいと思いながらもこのコードを書いているのですが上記の二つの関数をclassでまとめて使う有効な方法はないでしょうか?
また、そうではないとしても、定義した関数をうまくまとめるないし使いやすい状態で保存しておく方法は他にありますでしょか?
雑な質問になってしまっている点非常に申し訳ありませんがもし教えて頂けると嬉しいです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ロジック追いかけていませんが、単にメンバ変数等をうまく使えてないだけでしょうか。

Python

1class ngram_unique_list(): 2 def __init__(self, data, n): 3 self.data = data 4 self.n = n 5 6 def ngram(self): 7 data_new = [] 8 for i in range(len(self.data)-self.n+1): 9 a = [] 10 for k in range(self.n): 11 a += self.data[i+k] 12 data_new.append(a) 13 return data_new 14 15 def get_unique_list(self): 16 seen = [] 17 return [x for x in self.ngram() if x not in seen and not seen.append(x)] 18 19abc = 'ppppaaappff' 20a = ngram_unique_list(abc, 2) 21a.ngram()

投稿2019/03/03 15:29

編集2019/03/03 15:29
tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu__

2019/03/04 05:03

私の勉強不足かつ想像不足でした。非常に簡潔に教えて頂けて助かりました。 ありがとうございました。ベストアンサーにさせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問