代码之家  ›  专栏  ›  技术社区  ›  kopew

索引器:列表索引超出api的范围

  •  0
  • kopew  · 技术社区  · 2 年前
    all_currencies = currency_api('latest', 'currencies')  # {'eur': 'Euro', 'usd': 'United States dollar', ...}
    all_currencies.pop('brl')
    qtd_moedas = len(all_currencies)
    texto = f'{qtd_moedas} Moedas encontradas\n\n'
    moedas_importantes = ['usd', 'eur', 'gbp', 'chf', 'jpy', 'rub', 'aud', 'cad', 'ars']
    
    while len(moedas_importantes) != 0:
        for codigo, moeda in all_currencies.items():
            if codigo == moedas_importantes[0]:
                cotacao, data = currency_api('latest', f'currencies/{codigo}/brl')['brl'], currency_api('latest', f'currencies/{codigo}/brl')['date']
                texto += f'{moeda} ({codigo.upper()}) = R$ {cotacao}   [{data}]\n'
                moedas_importantes.remove(codigo)
                if len(moedas_importantes) == 0: break  # WITHOUT THIS LINE, GIVES ERROR
    

    为什么我会犯这个错误?该列表实际上已经没有元素了,但代码只适用于if

    1 回复  |  直到 2 年前
        1
  •  1
  •   Steve    2 年前

    你有一个嵌套的循环。进入while循环,然后在for循环中立即开始执行。中所有元素的执行仍在for循环中 all_currencies.items() .每次 codigo 是在 moedas_importantes ,该元素被移除。最终,您将从中删除所有元素 重要人物 ,但您仍然处于for循环和check中 if codigo == moedas_importantes[0] .在这一点上 重要人物 为空,因此会出现索引错误。

    我认为下面的代码将在没有嵌套循环的情况下工作。注意,这假设所有元素 重要人物 还有钥匙吗 all_currencies .

    all_currencies = currency_api('latest', 'currencies')  # {'eur': 'Euro', 'usd': 'United States dollar', ...}
    all_currencies.pop('brl')
    qtd_moedas = len(all_currencies)
    texto = f'{qtd_moedas} Moedas encontradas\n\n'
    moedas_importantes = ['usd', 'eur', 'gbp', 'chf', 'jpy', 'rub', 'aud', 'cad', 'ars']
    
    while len(moedas_importantes) != 0:
        codigo = moedas_importantes[0]
        moeda = all_currencies[codigo]
        cotacao, data = currency_api('latest', f'currencies/{codigo}/brl')['brl'], currency_api('latest', f'currencies/{codigo}/brl')['date']
        texto += f'{moeda} ({codigo.upper()}) = R$ {cotacao}   [{data}]\n'
        moedas_importantes.remove(codigo)