为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

智慧大石 2021-03-19 15:15:11
是否有一些简单的方法可以访问列表中的对象,而无需使用索引或遍历列表?简而言之:我正在从文本文件中读取行,拆分行,并从信息中创建对象。我不知道文本文件中将包含哪些信息。因此,例如:roomsfile.txt0 \卧室\一间带特大号床的卧室。\朝东的一扇门。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.roomExitsdef roomSetup():    roomsfile = "roomsfile.txt"    infile = open(roomsfile, 'r')    rooms = []    for line in infile:        rooms.append(makeRooms(line))    infile.close()    return roomsdef 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答案反对“动态创建的变量”,并主张使用字典。我尝试了这种方法,但是找不到找到访问添加到字典中的命名对象的方法(以及信息)的方法。总而言之:我是否缺少一些愚蠢的东西?
查看完整描述

3 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

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


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方法。您可以直接直接跟踪实例数据,如果以后需要更改实现,则可以将其重构为属性。它为您提供了getter和setter的所有灵活性,而无需事先准备好样板代码。


根据定义文件中存在的信息以及您的需求,您可能会更加幻想-例如,我可能希望将出口信息存储在字典中,该字典映射每个出口的规范名称(可能以'east开始”,“西”,“北”和“南”,并根据需要扩展到诸如“上”,“下”和“丹尼斯”之类的内容),以得到描述更长的元组和相关的Rooms实例。


我还将命名为“房间”而不是“房间”,但这是样式问题,而不是重要的行为。


查看完整回答
反对 回复 2021-03-30
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

您可以in用来检查成员资格(从字面上看,如果容器中有东西)。这适用于列表,字符串和其他可迭代项。


>>> li = ['a','b','c']

>>> 'a' in li

True

>>> 'x' in li

False


查看完整回答
反对 回复 2021-03-30
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

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


rooms = roomSetup()


exits_of_each_room = {}


for room in rooms:

  exits_of_each_room[room.getRoomName()] = room.getRoomExits()

然后,您的功能很简单:


def printRoomExits(exits_of_each_room, noun):

    print exits_of_each_room[noun]


查看完整回答
反对 回复 2021-03-30
  • 3 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信