Retrieve specific fields of a namedtuple instance from a nested list in Python

Issue

I am starting a project for school, a basic text-adventure game, where the player navigates through several rooms, each with a set of items, and adds an item to their inventory by spending a turn.

Since each item is unique to a room and each item is also unique in its stat benefits, I have done the following to implement these:

Item = namedtuple('Item', ['name', 'atk', 'defense', 'agi', 'hp'])

#Sport Store Items
bat = Item('Baseball Bat', 3, 1, 0, 0)
shoes = Item('Running Shoes', 0, 1, 3, 0)
dryeggs = Item('Freeze Dried Eggs', 0, 0, 1, 2)


#Clothes Store Items
belt = Item('Studded Belt', 1, 1, 0, 0)
candy = Item('Japanese Candy', 0, 0, 1, 1)
jacket = Item('Leather Jacket', 0, 3, 0, 1)

#Toy Store Items:
cars = Item('Toy Car Pack', 1, 1, 0, 0)
crayons = Item('Crayons', 0, 0, 1, 0)
toygun = Item('Toy Gun', 2, 1, 0, 0)

#Candle Store Items:
jar = Item('Candle Jar', 2, 0, 0, 0)
matches = Item('Matches', 1, 0, 1, 0)
wax = Item('Wax', 0, 2, 1, 0)

#Music Store Items:
disc = Item('Vinyl Disc', 2, 0, 1, 0)
guitar = Item('Electric Guitar', 3, 0, 0, 0)
symbol = Item('Symbol', 1, 2, 0, 0)

all_items = [
    [bat, shoes, dryeggs, '1'],
    [belt, candy, jacket, '2'],
    [cars, crayons, toygun, '3'],
    [jar, matches, wax, '4'],
    [disc, guitar, symbol, '5']
]

My issue is here, in my get_items function:

def get_items(id):
    for i in all_items:
        if i[3] == id:
            items = i
            items = list(items[0:4])
            return items
        else:
            continue

I’m trying to get the list of items based on the matching ID parameter. There is a function in another file that takes the player’s current position and sends it to other functions as the map_id. I’ve successfully made it so the name of the store changes based on this position, but I cannot figure out how to handle these sub-lists to return a specific sub-list based on the id.

For example, in the sport_store code, I’m trying to return the results like so:

def sport_store():
    room_id = '1'

    item_select = items.get_items(room_id)
    #FIXME: import items.py later with this function in it.
    if item_select != []:
    
        if entering == True:
            print('You enter the Sporting Goods Store.')
            print('There aren\'t many supplies left. What will you pick?')
        else:
            print('There aren\'t many supplies left. What will you pick?')

        print(item_select)

However, no matter what things I change in get_items’ loop to get it to work, I always return the original empty list of item_selection. I am trying to select the matching sub-list from the all_items global with the get_items function and then use that sub-list to make a new list that gets sent to item_selection showing the items for that store, and then format the namedtuples in it to show just the names value. Is this possible or do I need to convert the data to a dictionary?

Solution

you can use a dictionary for all items:

all_items = {
    '1':[bat, shoes, dryeggs],
    '2':[belt, candy, jacket],
    '3':[cars, crayons, toygun],
    '4':[jar, matches, wax],
    '5':[disc, guitar, symbol]
}

then, instead of calling items.getItems(room_id), you could just do all_items[room_id]. Hope this helps!

Answered By – LoLucky

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published