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

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

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

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

Q&A

解決済

3回答

1375閲覧

pythonで線形探索を行いたい

h_proc

総合スコア68

Python

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

0グッド

0クリップ

投稿2019/06/27 22:13

pythonで線形探索を行っています。データには、番号と名前プロフィール情報が書かれていて、ユーザーが探したい番号の人を探し、0が入力されたら、エラーメッセージを表示させたいです。しかし、次のようなエラーが出てしまいます。対処法を教えていただきたいです。よろしくお願いいたします。

python

1class Player: 2 def __init__(self,number,name,profile,next): 3 self.number = number 4 self.name = name 5 self.profile = profile 6 self.next = next 7 8def print_info(p:Player): 9 while (p != None): 10 print("{:>2d}".format(int(p.number)),p.name,p.profile) 11 p = p.next 12 print("") 13 14def search(x,p:Player): 15 for p in data: 16 if int(p.number) ==x: 17 print("{:>2d}".format(int(p.number)),p.name,p.profile) 18 print("") 19 break 20 else: 21 print("該当する選手はいません。") 22 print("") 23 24 25 26data = [] 27 28f = open('zac_japan.txt','r',encoding = 'utf-8') 29data = f.readlines() 30f.close 31 32p=None 33for n in data: 34 new = (n.split()) 35 p = Player(int(new[0]),new[1],new[2],p) 36 37print_info(p) 38 39while True: 40 print("探索する登録番号は?") 41 x=int(input()) 42 for n in data: 43 new = (n.split()) 44 p = Player(int(new[0]),new[1],new[2],p) 45 if x == 0: 46 print("プログラムを終了します。") 47 else: 48 search(x,p) 49

エラーメッセージ

if int(p.number) ==x: AttributeError: 'str' object has no attribute 'number'

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

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

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

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

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

guest

回答3

0

Python

1class Player: 2 def __init__(self,number,name,profile,next): 3 self.number = number 4 self.name = name 5 self.profile = profile 6 self.next = next 7 8def print_info(p:Player): 9 while (p != None): 10 print("{:>2d} {} {}".format(p.number, p.name, p.profile)) 11 p = p.next 12 print() 13 14def search(x, p:Player): 15 while p != None: 16 if p.number == x: 17 print("{:>2d} {} {}\n".format(p.number, p.name, p.profile)) 18 return 19 p = p.next 20 print("該当する選手はいません。\n") 21 22f = open('zac_japan.txt','r',encoding = 'utf-8') 23data = f.readlines() 24f.close 25 26p = None 27for n in data: 28 new = n.split() 29 p = Player(int(new[0]), new[1], new[2], p) 30 31print_info(p) 32 33while True: 34 print("探索する登録番号は?") 35 x = int(input()) 36 if x == 0: 37 print("プログラムを終了します。") 38 break 39 search(x, p)

動きました、ありがとうございました、で済ませないでください。

このコードで分からなないところは何か、よく考えて、ちゃんと調べて
それでも分からないところは、質問してください。

それから、質問にある元のプログラムの何が悪いのかが分かったなら、
それを説明してください。分からいないなら質問してください。

プログラムは論理的思考によって作成します。

例えば、data = f.readlines() で上書きされてしまうのに。
data = [] は何のためにあるのですか?
不要だと思いませんか?

読み込んだデータの最初の項目は int(new[0]) で int に変換しています。
それは Player の number に代入しますから、number は int です。
表示の時に int(p.number) とする必要はありません。

Python

1def search(x,p:Player) 2 for p in data: 3 if int(p.number) ==x:

自分で作った線形リスト p のなかにすべてのデータがあるのに、
どうしてまた入力データの data の中身を見ようとするのですか?
for の p は線形リストの p ではありません。
data が str のリストで、各str は各行の内容です。
p はその 1行の内容で、str です。
str に number という attribute はありません。

追記

print_info の中の print で余計な "\n" があったので削除しました。
search の中で、print() により空行を出していたのをその直前の
print の書式を "{:>2d} {} {}\n" にして、print() を削除したとき、
print_info の print も同じ書式にしようとコピペしたため
このバグが入ってしまいました。

投稿2019/06/28 05:04

編集2019/06/28 09:41
kazuma-s

総合スコア8224

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

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

guest

0

Python

1def search(x,p:Player): 2 for p in data:

原因はこの辺りでしょうね。
for ブロックの中で p は何を指すか、考えてみましょう。

投稿2019/06/28 00:06

Q71

総合スコア995

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

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

0

ベストアンサー

pはstrなので、number というメンバーがない、といってます。
そこらへんしらべてみては

投稿2019/06/27 23:55

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問