Bottom Page

Thread Rating:
  • 2 Vote(s) - 3 Average
  • 1
  • 2
  • 3
  • 4
  • 5
 Calling a list troubles
#1
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 None
The json looks like this:

[
 { 
  "aliases": ["carvedtwine","carved","carvedt","ct"],
  "value": 10
 }
]
Quote
#2
What does your config look like?
Quote
#3
(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
Quote
#4
(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
Quote
#5
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 None

with the json looking like this

https://pastebin.com/eNztKujJ
Quote
#6
(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.
Quote
#7
Maybe your new code should be something like this?
aliases = config_items['aliases']
if items in aliases:
    return [value[aliases[item]]]
Quote
#8
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.
Quote

Top Page

Possibly Related Threads...
Thread Author Replies Views Last Post
  making a dictionary from a list, one key with multiple values in a list within a list rhai 4 443 Oct-24-2018, 06:40 PM
Last Post: LeSchakal
  Calling function-- how to call simply return value, not whole process juliabrushett 2 596 Jul-01-2018, 01:17 AM
Last Post: juliabrushett
  Troubles on how to use Open CV knowledge1st 1 449 May-23-2018, 05:57 PM
Last Post: Larz60+
  Class and calling a method Zatoichi 3 678 Mar-13-2018, 08:44 PM
Last Post: Zatoichi
  Calling a Returned Value to Another Function valerydolce 9 2,050 Mar-28-2017, 09:54 PM
Last Post: valerydolce
  Calling a function to return a list of percentages Liquid_Ocelot 7 1,715 Mar-25-2017, 01:20 PM
Last Post: Larz60+

Forum Jump:


Users browsing this thread: 1 Guest(s)