2015-11-09 2 views
-8

Заслуживает:"список индексов должны быть целыми, не StR"

[[‘a’, ’m’], [’a’, ’n’], [‘b’, ’m’], [’b’, ’n’], [’c’, ’m’], [’c’, ’n’]] 

Getting Сообщение об ошибке:

TypeError: list indices must be integers, not str 

Код

for i in lst1: 
    for j in lst2: 
     cartesian_list.append([lst1[i], lst2[j]]) 
+2

Ну, ошибка говорит, что происходит. Вы не можете получить доступ к 'list ['a']'. –

+0

Я думаю, что сообщение об ошибке понятно. – jogo

+2

Цикл 'for' Python - это' для каждого'; 'для i в lst1:' итерации по элементам в списке, а не их индексы ... – jonrsharpe

ответ

1

Как уже упоминалось в предыдущем комментарии, то python for loop является итератором по каждому элементу коллекции. Вместо C, где обычно используется цикл for для создания значений индекса for (int i = 0; i < X; i++), которые впоследствии используются для извлечения значения по этому индексу из некоторого массива, эквивалентный код на Python будет устанавливать значение i, равное значению, создаваемому итератором, для этого сбор или генератор. Поскольку список представляет собой упорядоченную коллекцию, вы получите стандартное последовательное поведение итератора.

Имея это в виду, вы можете использовать вместо этого значения i и j непосредственно исправить код:

cartesian_list.append([i, j]) 

Однако, есть более простой ярлык в Python с помощью itertools:

from itertools import product 
cartesian_list = list(product('abc', 'mn')) 
print(cartesian_list) 

Выход:

[('a', 'm'), ('a', 'n'), ('b', 'm'), ('b', 'n'), ('c', 'm'), ('c', 'n')] 
+0

спасибо вам большое – david007killer

1

Если вы перебираете lis t в Python, переменная (в этом случае: i и j) получит назначенный каждому элементу итерируемого объекта, который вы передаете ему.

Глядя на ваш код и assumtion вывода Я полагаю эти списки определяются:

lst1 = ['a', 'b', 'c'] 
lst2 = ['m', 'n'] 
cartesian_list = [] 

Имейте в виду, что каждый элемент из обоих списков является строкой.

В коде вы пытаетесь взять индекс i (где i - строка!) Lst1. Это невозможно. «Ошибка типа», которую вы видите, - это просто Python, говорящий вам, что i (и j, если на то пошло) является строкой. Это должно быть целое число, которое должно использоваться как это.

Есть два основных способа крепления этого:

for i in lst1: 
    for j in lst2: 
     cartesian_list.append([i, j]) 

Таким образом, вы должны изменить только часть вашего кода. Другой способ устранения проблемы - сделать i и j итерацией по индексам, как вы их намеревались сделать.

for i in range(len(lst1)): 
    for j in range(len(lst2)): 
     cartesian_list.append([lst1[i], lst2[j]]) 

Используя этот метод, я Переберу теоретический список [0, 1, 2 ... Len (lst1) -1]. Range() исключает последнее заданное значение, поэтому безопасно использовать только len() (что дало бы 3, если последний индекс равен 2).

Надеюсь, я помог!

+0

спасибо, что вы мне очень помогли – david007killer

Смежные вопросы