是否有一些简单的方法可以访问列表中的对象,而无需使用索引或遍历列表?
简而言之: 我正在从文本文件中读取行,分割行,并从信息创建对象。我不知道文本文件中会包含哪些信息。例如:
roomsfile.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()
但同样,我不知道文本文件中会包含哪些信息,也不知道要进行哪些分配。 This StackOverFlow answer反对“动态创建的变量”,并赞成使用字典。我试过这种方法,但是我找不到一种方法来访问我添加到字典中的命名对象的方法(以及信息)。
总而言之:我错过了一些愚蠢的东西吗?
提前致谢!对于这本书的长篇帖子感到抱歉 - 我想提供足够的细节。
克里斯
答案 0 :(得分:1)
您可以使用in
来检查成员资格(字面意思是,如果 容器中的某些内容)。这适用于列表,字符串和其他迭代。
>>> li = ['a','b','c']
>>> 'a' in li
True
>>> 'x' in li
False
答案 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方法。您可以直接跟踪实例数据,如果以后需要更改实现,请将它们重构为属性。它为您提供了getter和setter的所有灵活性,而无需事先获得样板代码。
根据您的定义文件中存在的信息以及您的需求,您可以获得更好的体验 - 例如,我可能希望将我的退出信息存储在字典中,为每个出口映射一个规范名称(可能已经开始)使用'east','west','north'和'south',并扩展到'up','down'和'dennis'等必要的东西)到更长描述的元组和相关的Rooms实例
我还会将课程命名为Room而不是Rooms,但这是一个风格问题,而不是重要的行为。
答案 2 :(得分:0)
阅读完房间后,您可以创建字典:
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]