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

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

ただいまの
回答率

90.51%

  • Python

    11741questions

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

  • Python 3.x

    9829questions

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

[至急]Python 線形リスト。エラーで困っています。TypeError: 'Linear_List' object does not support indexing

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,097

flower

score 18

前提

線形リストの実装の課題です。問題文は以下の通りです。

LIST-INSERT(L,x)を用いるなどして、1~10までの整数をランダム(手動で可)に並べた線形リストを作成し、先頭から順に要素を書き出して、正しく線形リストができていることを示してください。

課題のヒントで与えられた疑似コード

連結リストの疑似コードなので線形リストとは少し異なると思います。

LIST-SEARCH(𝐿,𝑘)
 𝑥 ← 𝐿.ℎ𝑒𝑎𝑑 
 while 𝑥 ≠ NIL かつ 𝑥.𝑘𝑒𝑦 ≠ 𝑘
  𝑥 = 𝑥.𝑛𝑒𝑥𝑡
 return 𝑥

LIST-INSERT(𝐿,𝑥)
 𝑥.𝑛𝑒𝑥𝑡 = 𝐿.ℎ𝑒𝑎𝑑
 if 𝐿.ℎ𝑒𝑎𝑑 ≠ NIL
  𝐿.ℎ𝑒𝑎𝑑.𝑝𝑟𝑒𝑣 = 𝑥
 𝐿.ℎ𝑒𝑎𝑑 = 𝑥
 𝑥.𝑝𝑟𝑒𝑣=NIL

LIST-DELETE(𝐿,𝑥)
 if 𝑥.𝑝𝑟𝑒𝑣 ≠ NIL
  𝑥.𝑝𝑟𝑒𝑣.𝑛𝑒𝑥𝑡 = 𝑥.𝑛𝑒𝑥𝑡
 else 𝐿.ℎ𝑒𝑎𝑑 = 𝑥.𝑛𝑒𝑥𝑡
 if 𝑥.𝑛𝑒𝑥𝑡 ≠ NIL 
  𝑥.𝑛𝑒𝑥𝑡.𝑝𝑟𝑒𝑣 = 𝑥.𝑝𝑟𝑒𝑣

試したこと

色々なサイトを参考にして実装しました。

class Linear_List(object):
    def __init__(self, init_elems=[]):
        self.head = ListElement()
        self.head.next = None
        for ie in init_elems:
            self.append(ie)

    def __contains__(self, value):
        sp = self.head
        while sp.next is not None:
            sp = sp.next
            if sp.value == value:
                return True
        else:
            return False

    def List_Search(self, index):

        if not (isinstance(index, int)):
            raise TypeError
        if not (-1 * len(self) <= index < len(self)):
            raise IndexError
        if index < 0:
            index += len(self)
        sp = self.head
        for i in range(index):
            sp = sp.next
        return sp.next

    def List_Insert(self, index, value):
        if not (isinstance(index, int)):
            raise TypeError
        if not (-1 * len(self) <= index < len(self)):
            raise IndexError
        if index < 0:
            index += len(self)
        sp = self.head
        for i in range(index):
            sp = sp.next
        sp.next.value = value

    def List_Delete(self, index):
        if not (isinstance(index, int)):
            raise TypeError
        if not (-1 * len(self) <= index < len(self)):
            raise IndexError
        if index < 0:
            index += len(self)
        sp = self.head
        for i in range(index):
            sp = sp.next
        n = sp.next
        sp.next = sp.next.next
        del n

    def __len__(self):
        sp = self.head
        count = 0
        while sp.next is not None:
            sp = sp.next
            count += 1
        return count

    def __iter__(self):
        return Linear_List_Iterator(self.head)

    def __str__(self):
        sp = self.head
        array = []
        while sp.next is not None:
            sp = sp.next
            array.append(sp.value)
        return 'Linear_List: ' + '[' + ', '.join(map(str, array)) + ']'

    def __repr__(self):
        sp = self.head
        array = []
        while sp.next is not None:
            sp = sp.next
            array.append(sp.value)
        return repr(array)

    def append(self, value):
        self.insert(len(self), value)

    def insert(self, index, value):
        if not (isinstance(index, int)):
            raise TypeError
        if not (-1 * len(self) <= index <= len(self)):
            raise IndexError
        if index < 0:
            index += len(self)
        sp = self.head
        for i in range(index):
            sp = sp.next
        n = ListElement(value=value)
        n.next = sp.next
        sp.next = n

class ListElement(object):
    def __init__(self, value=None):
        self.value = value
        self.next = None

    def __str__(self):
        return str(self.value)

    def __repr__(self):
        return repr(self.value)

class Linear_List_Iterator(object):
    def __init__(self, head):
        self.head = head
        self.node = self.head.next

    def next(self):
        if self.node is None:
            raise StopIteration
        else:
            val = self.node.value
            self.node = self.node.next
            return val

if __name__ == '__main__':
    import doctest
    doctest.testmod()

"""
↓ランダムに数字を入れたリストを作成
"""
a = Linear_List()

a.append(3)
a.append(7)
a.append(2)
a.append(4)
a.append(5)
a.append(10)
a.append(9)
a.append(6)
a.append(1)
a.append(8)

"""
↓リストの要素を順に表示
"""
for i in range(len(a)):
    print(a[i])

発生している問題・エラーメッセージ

TypeError: 'Linear_List' object does not support indexing

困っていること

最後の行で、リストの要素をひとつずつ順に表示させたいのですが、
エラーになってしまって困っています。まず、なにが原因でエラーが出てしまうのかを教えていただきたいです。その解決方法も教えてくださると助かります。お願いします。

実行結果

Linear_List: [3, 7, 2, 4, 5, 10, 9, 6, 1, 8]
Traceback (most recent call last):
  File "C:\Users\List_Insert.py", line 143, in <module>
    print(a[1])
TypeError: 'Linear_List' object does not support indexing
>>> 

補足情報(言語/FW/ツール等のバージョンなど)

使用ツール:Python3.5.1

至らない点が多々あり、申し訳ございませんでした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2017/05/17 19:23

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

+1

まずエラーメッセージを見ます。

TypeError: 'Linear_List' object does not support indexing


indexing というものをサポートしていないのが原因だとわかります。

どうすればいいのかを調べるために Google で調べます。
キーワードは「python TypeError object does not support indexing」とします。

Stack Overflow でこのエラーメッセージについての質問があることがわかります。
覗いて解決策を知ります。

追記

なお、エラーメッセージはそれだけではありませんね。

Traceback (most recent call last):
  File "C:\Users\List_Insert.py", line 143, in <module>
    print(a[1])


どこで問題が起こっているのかが表示されています。
この場合は C:\Users\List_Insert.py の 143 行目 print(a[1]) という部分です。
これも重要な情報ですから、次にエラーがあったときには忘れず見てください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/17 20:28

    関数List_Searchの名前を__getitem__にし、
    最後の行を
    for i in range(len(a)):
    print(Linear_List.__getitem__(a, i))
    にすることによって解決いたしました。
    回答ありがとうございました。
    エラーの対処の仕方、今後参考にさせていただきます!

    キャンセル

checkベストアンサー

0

getitemメソッドを装備しないと、a[1]のような添え字アクセスはできないのです。
装備してください。O(1)で書けるはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/17 20:26

    関数List_Searchの名前を__getitem__にし、
    最後の行を
    for i in range(len(a)):
    print(Linear_List.__getitem__(a, i))
    にすることによって解決いたしました。

    ありがとうございました(o_ _)o))

    キャンセル

  • 2017/05/20 22:33

    あれっそしたら最後の行、print(a[i])のままで通りませんでしたか。
    目的は達成できたようなのでいいのですが。

    キャンセル

同じタグがついた質問を見る

  • Python

    11741questions

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

  • Python 3.x

    9829questions

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