检查用户输入是否在对象列表中

时间:2017-01-30 10:33:54

标签: python list input

我正在进行文字冒险并尝试让玩家从房间里拿起物品。我这样做的方法是让房间有一个items属性,这是一个来自items模块的对象列表。我试图检查用户的输入是否在列表中,但即使它们相同,也表示它不在其中。

world.py:

class ItemTile(MapTile):
    def __init__(self, x, y):
        self.items = [items.Bread(), items.Herbs()]
        super().__init__(x, y)

items.py:

class Bread(Consumeable):
    def __init__(self):
        self.name = "Bread"
        self.healing_value = 15
        self.value = 20

game.py:

elif hasattr(room, "items") and 'take' in action:
    player.pick_up(action)

player.py:

 def pick_up(self, action):
        room = world.tile_at(self.x, self.y)
        item = action[5:]
        item = item.title()
        print(item, room.items[0])
        if item in room.items:
            self.inventory.append(item)
            room.items.remove(item)
            print('You pick up the {}'.format(item))
        else:
            print("You see no such thing.")

例如,如果我输入'take bread'(只是打印以显示它们是相同的):

Bread Bread
You see no such thing.

我的IDE也说消耗品类self.name下没有解决。

2 个答案:

答案 0 :(得分:0)

由于您已经拥有name属性,因此最好与此onw进行比较:

if item.lower() in [i.name.lower() for i in room.items]:

说明:[i.name.lower() for i in room.items]是一个"列表理解"并构建一个列表,其中包含name中所有房间的room.items属性。我添加了lower(),因为您很可能不希望这种情况发生。

答案 1 :(得分:0)

在上一个方法中,您将项目的值设置为两次,紧接着:

    item = action[5:]
    item = item.title()

标题将取代“动作[5:]”的任何值。但这不是重点。你有一个(大概)对象的列表,它们实际上可能看起来像[,],你试着将这些值与“面包”进行比较,这很可能根本不会出现在那里。

对象在创建时具有散列值,以便将它们与具有相同“名称”的其他对象区分开来。

在您的项目列表中,您有2个实例,而且预先几乎没有办法告诉它们的哈希值是什么,更不用说比较它们了。