Подтвердить что ты не робот

Индексы списка Python должны быть целыми, а не кортежем "

Я уже два дня бил головой об этом. Я новичок в python и программировании, поэтому другие примеры этого типа ошибок не очень помогли мне. Я читаю документацию для списков и кортежей, но не нашел ничего, что помогает. Любой указатель был бы очень оценен. Не обязательно искать ответ, просто больше ресурсов на том, где искать. Я использую Python 2.7.6. Благодаря

measure = raw_input("How would you like to measure the coins? Enter 1 for grams 2 for pounds.  ")

coin_args = [
["pennies", '2.5', '50.0', '.01'] 
["nickles", '5.0', '40.0', '.05']
["dimes", '2.268', '50.0', '.1']
["quarters", '5.67', '40.0', '.25']
]

if measure == 2:
    for coin, coin_weight, rolls, worth in coin_args:
        print "Enter the weight of your %s" % (coin)
        weight = float(raw_input())
        convert2grams = weight * 453.592

        num_coin = convert2grams / (float(coin_weight))
        num_roll = round(num_coin / (float(rolls)))
        amount = round(num_coin * (float(worth)), 2)

        print "You have %d %s, worth $ %d, and will need %d rolls." % (num_coin, coin, amount, num_roll)

else:
    for coin, coin_weight, rolls, worth in coin_args:
        print "Enter the weight of your %s" % (coin)
        weight = float(raw_input())

        num_coin = weight / (float(coin_weight))
        num_roll = round(num_coin / (float(rolls)))
        amount = round(num_coin * (float(worth)), 2)

        print "You have %d %s, worth $ %d, and will need %d rolls." % (num_coin, coin, amount, num_roll)

Это трассировка стека:

File ".\coin_estimator_by_weight.py", line 5, in <module>
  ["nickles", '5.0', '40.0', '.05']
TypeError: list indices must be integers, not tuple
4b9b3361

Ответ 1

Проблема в том, что [...] в python имеет два разных значения

  • expr [ index ] означает доступ к элементу списка
  • [ expr1, expr2, expr3 ] означает создание списка из трех элементов из трех выражений

В вашем коде вы забыли запятую между выражениями для элементов во внешнем списке:

[ [a, b, c] [d, e, f] [g, h, i] ]

поэтому Python интерпретировал начало второго элемента как индекс, который должен применяться к первому, и это то, что говорит сообщение об ошибке.

Правильный синтаксис для того, что вы ищете,

[ [a, b, c], [d, e, f], [g, h, i] ]

Ответ 2

Чтобы создать список списков, вам нужно разделить их запятыми, например

coin_args = [
    ["pennies", '2.5', '50.0', '.01'],
    ["nickles", '5.0', '40.0', '.05'],
    ["dimes", '2.268', '50.0', '.1'],
    ["quarters", '5.67', '40.0', '.25']
]

Ответ 3

Почему в ошибке упоминаются кортежи?

Другие объяснили, что проблема заключалась в отсутствии ,, но последняя загадка - почему сообщение об ошибке говорит о кортежах?

Причина в том, что ваш:

["pennies", '2.5', '50.0', '.01'] 
["nickles", '5.0', '40.0', '.05']

можно свести к:

[][1, 2]

как упомянутый 6502 с той же ошибкой.

Но тогда __getitem__, который имеет дело с разрешением [], преобразует object[1, 2] в кортеж:

class C(object):
    def __getitem__(self, k):
        return k

# Single argument is passed directly.
assert C()[0] == 0

# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)

а реализация __getitem__ для встроенного класса списка не может обрабатывать такие аргументы.

Я также рекомендую вам в будущем создавать минимальные примеры: -)

Дополнительные примеры __getitem__ action at: fooobar.com/info/43409/...