有没有一种方法可以在列表中查找对象而不必遍历列表?

2024-09-27 07:31:19 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有什么简单的方法可以在不使用索引或遍历列表的情况下访问列表中的对象?在

简而言之: 我从一个文本文件中读入行,拆分行,并从信息中创建对象。我不知道文本文件中会有什么信息。例如:

在roomsfile.txt文件在

0\bedroom\A bedroom with king size bed.\A door to the east.

1\kitchen\A modern kitchen with steel and chrome.\A door to the west.

2\familyRoom\A huge family room with a tv and couch.\A door to the south.

一些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)

当我想知道卧室有什么出口时,我必须用类似于下面的内容在列表中迭代(其中“noun”由用户作为“卧室”传递):

^{pr2}$

这是可行的,但感觉好像我错过了一些更简单的方法…尤其是因为我有一块拼图(即本例中的“卧室”)。尤其是因为房间列表中可能有数千个对象。在

我可以创建一个任务:

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

然后做:

bedroom.getRoomExits()

但是,我不知道文本文件中会有什么信息,也不知道要做什么作业。This StackOverFlow answer反对“动态创建变量”,支持使用字典。我尝试了这种方法,但是我找不到一种方法来访问我添加到字典中的命名对象的方法(以及信息)。在

总而言之:我是不是错过了一些愚蠢的事情?在

提前谢谢!很抱歉我的文章篇幅很长-我想给你足够的细节。在

克里斯


Tags: 对象方法self信息列表returndefwith
3条回答

您可以使用in来检查成员资格(字面上,如果容器中有。这适用于列表、字符串和其他ITerable。在

>>> li = ['a','b','c']
>>> 'a' in li
True
>>> 'x' in li
False

阅读完房间后,您可以创建字典:

rooms = roomSetup()

exits_of_each_room = {}

for room in rooms:
  exits_of_each_room[room.getRoomName()] = room.getRoomExits()

那么你的功能就是:

^{pr2}$

至少有一本字典是正确的答案。设置它的方法至少是按名称索引:

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实例:

^{pr2}$

我不使用getRoomName和getRoomExits方法是有原因的——在Python中,getter和setter方法是不必要的。您可以直接跟踪实例数据,如果以后需要更改实现,可以将它们重构为属性。它为您提供了getter和setter的所有灵活性,而不需要预先使用样板代码。在

根据定义文件中显示的信息以及您的需求,您可以获得更丰富的信息—例如,我可能希望将我的出口信息存储在字典中,映射每个出口的规范名称(可能以“东”、“西”、“北”和“南”开头,然后扩展到“向上”之类的内容,“down”和'dennis'(如有必要)转换为描述较长的元组和相关的Rooms实例。在

我也会命名教室而不是房间,但这是一个风格问题,而不是重要的行为。在

相关问题 更多 >

    热门问题