Calling a list troubles - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Homework (https://python-forum.io/forum-9.html) +--- Thread: Calling a list troubles (/thread-15293.html) |
Calling a list troubles - giveen - Jan-11-2019 I'm struggling to get this list from a json file to call correctly, and I was hoping for help. I'm still really new to learning python. I always end up with "TypeError: list indices must be integers or slices, not str" CONFIG_ITEMS = 'items.json' with open(CONFIG_ITEMS) as json_data_file: config_items = json.load(json_data_file) def get_value(items:str): items = items.replace(" ", "").lower() aliases = config_items['aliases'] if items in aliases: return [value[aliases]] else: return NoneThe json looks like this: [ { "aliases": ["carvedtwine","carved","carvedt","ct"], "value": 10 } ] RE: Calling a list troubles - micseydel - Jan-11-2019 What does your config look like? RE: Calling a list troubles - giveen - Jan-11-2019 (Jan-11-2019, 07:21 PM)micseydel Wrote: What does your config look like?I posted a snippet above, but here is the full thing. https://pastebin.com/pKsuKzXZ RE: Calling a list troubles - nilamo - Jan-11-2019 (Jan-11-2019, 07:09 PM)giveen Wrote:aliases = config_items['aliases'] if items in aliases: return [value[aliases]] aliases is a list. Using a list as an index doesn't make sense, so what is your intention with this code snippet?>>> aliases = ["spam", "eggs"] >>> value = list(range(5)) >>> value[aliases] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: list indices must be integers or slices, not list RE: Calling a list troubles - giveen - Jan-11-2019 The code feeds back into a discord command. I know this works, as my previous version of the bot works fine, but the json file was a mess and needed to be completely rewritten. async def calc(ctx, quantity: float, itemA: str, itemB: str): itemAPrice = get_value(itemA) itemBPrice = get_value(itemB) if itemAPrice and itemBPrice: itemQuotient = itemAPrice/itemBPrice itemBEquivalent = round(quantity * itemQuotient, 2) quantity = quantity itemA = itemA itemBEquivalent = itemBEquivalent itemB = itemB author = ctx.message.author.name embed=discord.Embed(title="\N{CONVENIENCE STORE} Recommended Exchange Rate \N{CONVENIENCE STORE}", description=f'{quantity} {itemA} is equal to {itemBEquivalent} {itemB}', color=0xDA70D6) embed.set_footer(text=f"Requested by {author}") await ctx.send(embed=embed) await ctx.message.delete() elif not itemAPrice: await ctx.send('No match found for ' + itemA) elif not itemBPrice: await ctx.send('No match found for ' + itemB)Previous version of it looked like this. CONFIG = 'config.json' with open(CONFIG) as json_data_file: config = json.load(json_data_file) TOKEN = config['token'] items = config['items'] BOT_PREFIX = config['prefix'] aliases = config['aliases'] def get_value(item: str): if item: item = item.replace(" ", "").lower() try: return items[aliases[item]] except KeyError: return else: return Nonewith the json looking like this https://pastebin.com/eNztKujJ RE: Calling a list troubles - nilamo - Jan-11-2019 (Jan-11-2019, 07:44 PM)giveen Wrote: return items[aliases[item]]That's different from what you're doing, though. In this version, you're getting one particular item out of the aliases (this time, aliases is probably a dict though), and using the value from aliases as a key/index to items , instead of using the whole aliases list as the index.
RE: Calling a list troubles - nilamo - Jan-11-2019 Maybe your new code should be something like this? aliases = config_items['aliases'] if items in aliases: return [value[aliases[item]]] RE: Calling a list troubles - giveen - Jan-11-2019 That was what I had played with as well, similar idea. Still studying deeper into JSON syntax to see where I could be going wrong. TypeError: list indices must be integers or slices, not str I think slicing needs to be done, so I'm reading up on it. |