0

インデックスを使用したり、リストを反復処理したりせずに、リスト内のオブジェクトにアクセスする簡単な方法はありますか?

簡単に言うと、テキスト ファイルから行単位で読み取り、行を分割し、情報からオブジェクトを作成しています。テキストファイルにどのような情報が含まれているかわかりません。たとえば、次のようになります。

部屋ファイル.txt

0\寝室\キングサイズのベッドが置かれた寝室。\東への扉。

1\kitchen\スチールとクロームのモダンなキッチン\西への扉。

2\familyRoom\テレビとソファのある大きな家族部屋\南への扉.

いくつかの Python コード:

class Rooms:
    def __init__(self, roomNum, roomName, roomDesc, roomExits):
        self.roomNum = roomNum
        self.roomName = roomName
        self.roomDesc = roomDesc
        self.roomExits = roomExits

    def getRoomNum(self):
        return self.roomNum

    def getRoomName(self):
        return self.roomName

    def getRoomDesc(self):
        return self.roomDesc

    def getRoomExits(self):
        return self.roomExits

def roomSetup():
    roomsfile = "roomsfile.txt"
    infile = open(roomsfile, 'r')
    rooms = []
    for line in infile:
        rooms.append(makeRooms(line))
    infile.close()
    return rooms

def makeRooms(infoStr):
    roomNum, roomName, roomDesc, roomExits = infoStr.split("\")
    return Rooms(roomNum, roomName, roomDesc, roomExits)

寝室の出口を知りたいときは、次のようなリストを反復処理する必要があります (「名詞」はユーザーによって「寝室」として渡されます)。

def printRoomExits(rooms, noun):
    numRooms = len(rooms)
    for n in range(numRooms):
        checkRoom = rooms[n].getRoomName()
        if checkRoom == noun:
            print(rooms[n].getRoomExits())
        else:
            pass

これは機能しますが、より簡単なアプローチが欠けているように感じます...特に、パズルのピース(この場合は「ベッドルーム」)があるため...そして特に、部屋のリストには何千ものオブジェクトが含まれている可能性があるためですそれ。

割り当てを作成できます:

bedroom = makeRooms(0, bedroom, etc, etc)

そして、次のようにします。

bedroom.getRoomExits()

しかし、繰り返しになりますが、テキスト ファイルにどのような情報が含まれるかはわかりません。また、どのような割り当てを行うべきかもわかりません。 この StackOverFlow の回答は、「動的に作成された変数」に反対し、辞書の使用を支持しています。このアプローチを試みましたが、辞書に追加した名前付きオブジェクトのメソッド (したがって情報) にアクセスする方法が見つかりませんでした。

要するに、私は何かばかげたことを見逃していますか?

前もって感謝します!そして、本の長さの投稿で申し訳ありません-十分な詳細を提供したかった.

クリス

4

3 に答える 3

1

ここでは、少なくとも 1 つの辞書が正解です。設定する方法は、少なくとも名前でインデックスを作成することです。

def roomSetup():
    roomsfile = "roomsfile.txt"
    infile = open(roomsfile, 'r')
    rooms = {}
    for line in infile:
        newroom = makeRooms(line)
        rooms[newroom.roomName] = newroom
    infile.close()
    return rooms

次に、名前を指定して、Rooms インスタンスに直接アクセスできます。

exits = rooms['bedroom'].roomExits

getRoomName メソッドと getRoomExits メソッドを使用しないのには理由があります。Python では getter メソッドと setter メソッドは不要です。インスタンス データを直接追跡できます。後で実装を変更する必要がある場合は、それらをプロパティにリファクタリングします。前もって定型コードを必要とせずに、ゲッターとセッターのすべての柔軟性を提供します。

定義ファイルに存在する情報とニーズに応じて、より洗練されたものにすることができます。たとえば、各出口の正規名をマッピングする辞書に出口情報を格納したいと思うでしょう (おそらく 'east で始まる) '、'west'、'north'、'south'、および必要に応じて 'up'、'down'、'dennis'などに拡張) を、より長い説明と関連する Rooms インスタンスのタプルに変換します。

クラスの名前を Rooms ではなく Room にすることもできますが、これは重要な動作ではなく、スタイルの問題です。

于 2013-06-05T05:05:52.490 に答える
1

メンバーシップを確認するために使用できますin(文字通り、何かがコンテナー内にあるかどうか)。これは、リスト、文字列、およびその他のイテラブルに対して機能します。

>>> li = ['a','b','c']
>>> 'a' in li
True
>>> 'x' in li
False
于 2013-06-05T04:39:28.113 に答える