アプリ版:「スタンプのみでお礼する」機能のリリースについて

pythonの単方向リストについて質問です。講義中に単方向リスト実装の穴埋め形式の練習問題が出まして、先生曰く、3カ所ある穴埋めのうち全てが最短で1行で表すことが出来るらしいのですが、自分で考えてみても10行前後の冗長なコードしか思いつきませんでした。その後最短各1行で表すやり方の解説はなく、「課題にはしないから気楽におうちで考えてみてね」の一言で終わりモヤモヤしています。かといってテスト期間が近いこともあり、要領の良くない自分としてはあまりこういったおまけ的なところよりも優先度の高い項目の勉強に時間を割きたいというのが正直なところです。
そこでお願いなのですが、誰か答えの思いついた方がいらっしゃれば教えていただきたいです。お願いします。
(穴埋めコード)「#ここを埋める」と書かれた3カ所が穴埋め対象です。
# リストの要素を定義するクラス
class Cell():
def __init__(self, n, k, v):
self.next = n # 次のCell
self.key = k # キー(文字列)
self.value = v # 値(数値)


# リストに要素を挿入する関数
def insertCell(head, key, value):
# ここを埋める


# リストからkeyに対応する要素を削除する関数
def deleteCell(head, key):
# ここを埋める


# リストからkeyに対応する要素の値を得る関数
def searchCell(head, key):
# ここを埋める


# リストを全てクリアする関数
def clearCell(head):
while head.next != None:
tmp = head.next.next
del head.next
head.next = tmp

# リストを全て表示する関数
def printCell(head) :
text = "[ "
while head.next != None:
text += str(head.next.value)
if head.next.next != None:
text += ", "
head = head.next
text += " ]"
print(text)

if __name__ == "__main__":
# リストの先頭
# Noneは次の要素が無いことを表す
head = Cell(None, "head", -1)

insertCell(head, "one", 1)
insertCell(head, "two", 2)
insertCell(head, "three", 3)
printCell(head); #[1, 2, 3]

deleteCell(head, "two");
printCell(head) # [1, 3]

insertCell(head, "four", 4)
insertCell(head, "five", 5)
deleteCell(head, "five")
printCell(head) # [1, 3, 4]

print(searchCell(head, "three")) # 3
print(searchCell(head, "two")) # not found

clearCell(head)
printCell(head) # []

質問者からの補足コメント

  • 1.配布されたサンプルコードを見ると、printCellの定義式のインデントがこんな感じ(画像)になっています。また、各定義式のインデントの位置はclass Cell~のインデントと同じく左詰になってます。
    2.恐らく10行目で定義されているものと見比べても、見たところスペルミスや半角全角の違いもありませんし、insertCell はそれで間違いないかと思います。
    3.この練習問題の次にチェイン法でテーブルに要素を挿入(insertTable(key, value))、テーブルから要素を削除、テーブルから値を検索するコードを書く問題が出ているのですが、そちらでこの練習問題で書いた3コードがそのまま使われている以上、insertCellの引数は(head, key, value)で間違いないかと思います。(まだチェイン法の方は解いてないので絶対この引数で合っているとはいえませんが...)

    「pythonにおける単方向リストの実装に」の補足画像1
    No.1の回答に寄せられた補足コメントです。 補足日時:2022/07/13 14:52
  • そうですね。
    問題点1、2ともども、もともとのサンプルコードの通りとなっております。

    No.2の回答に寄せられた補足コメントです。 補足日時:2022/07/13 20:10

A 回答 (4件)

    • good
    • 1
この回答へのお礼

解答ありがとうございました!
「最短で1行ほどで~」といわれて身構えてましたが案外シンプルな構文で書けちゃうんですね...

お礼日時:2022/07/15 02:22

>問題点1、2ともども、もともとのサンプルコードの通りとなっております。


def insertCell
def deleteCell
・・・
def printCell
は、class Cell()内のメソッドかと思ったのですが、
そうではないのですね。
それなら、納得しました。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました!
そして誠に申し訳ありませんが、無事解決致しましたので解答を締め切ろうかと思います。申し訳ございません。
3回答いただきましたがここでのお礼で全回答へのお礼とさせていただきます。
ご協力の程ありがとうございました!

お礼日時:2022/07/15 02:25

問題点1


insertCell(head, "one", 1)は
head.insertCell("one", 1)の誤り

printCell(head)は
head.printCell()の誤り

deleteCell(head, "two")は
head.deleteCell("two")の誤り(他のメソッドも同様)

のように思えるのですが、本当に配布されたサンプルコードに
insertCell(head, "one", 1)
insertCell(head, "two", 2)
insertCell(head, "three", 3)
printCell(head); #[1, 2, 3]
deleteCell(head, "two");
printCell(head) # [1, 3]
・・・以下省略・・・
と記述されていたのでしょうか。

問題点2
# リストに要素を挿入する関数
def insertCell(head, key, value):
は、誤りではないですが、
def insertCell(self, key, value):
と書くのが一般的です。
配布されたサンプルコードに
def insertCell(head, key, value):とかかれているなら、
意図的にselfでなくheadを使用したと思われます。
この回答への補足あり
    • good
    • 0

あなたから提示されたソースをインデントをつけて下記URLで実行してみました。


「#ここを埋める」箇所はとりあえず、コンパイルエラーにならないようにpassを入れてます。
https://ideone.com/enb8Th

補足要求です。
1.インデントはあってますか。

2.実行すると、50行目のinsertCell(head, "one", 1)
でNameError: name 'insertCell' is not defined
が、発生します。
50行目は、本当にこれで正しいことが保証されていますか。

3.# リストに要素を挿入する関数の引数の定義は
def insertCell(head, key, value):
となっていますが、本当にこれで正しいことが保証されていますか。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!