Кажется, это немного запутанно напечатано так, но то, что я хочу, должно быть довольно простым. У меня есть список списков в Python.
Давайте скажем list = [[A, B, C], [D, B], [E], [X, Y, Z]]
Я хочу перебрать элементы каждого внутреннего списка, следуя определенному порядку Я попробовал
for i in range(0, 10):
for item in list[i]:
<do action on item>
Но я получаю синтаксическую ошибку от Python, указывающую на list[i]
, похоже, не очень нравится.
EDIT: я хочу, чтобы итерация через один внутренний список за раз Например:
for i in range(0, 1):
print i
for item in list[i] #or something that works..
print item
будет печатать
0
A
B
C
1
D
B
Любая идея, почему это блокируется?
И трассировка просто говорит, что там есть синтаксическая ошибка...
RE- EDIT: Я решил свою проблему, используя другую структуру данных. Это было немного сложнее. Извините за то, что тратил свое время, но спасибо за советы в любом случае!
Это потому, что ваш внешний список имеет только 4 элемента и, следовательно, не имеет индекса 4 (или 5 или 6 и т.д.). Вот почему вы получаете индексную ошибку.
Это аналогично:
L = [1, 2, 3] L [6] # L не имеет 6-го индекса Traceback (последний последний вызов): Файл "", строка 1, в IndexError: индекс индекса вне диапазона
Вместо этого вы должны сделать следующее:
for sub_list in L:
for item in sub_list:
<do action on item>
В ответ на ваше редактирование:
В качестве примечания не используйте типы как имена переменных. Поэтому не называйте список списков. Возможно, именно здесь происходит некоторая неприязнь.
Если ошибка связана с тем, что "тип не подлежит расшифровке", то именно поэтому вы получаете ошибку. Вы можете исправить это, изменив имя list
на что-то еще - я бы порекомендовал L
Вы ищете
for my_list in list_of_lists:
for item in my_list:
# whatever
enumerate
: for i, my_list in enumerate(list_of_lists):
То, что вы хотите, - это цепочка подсписок и повторение. Модуль Itertools имеет функцию для этого и очень прост и эффективен:
for item in itertools.chain.from_iterable(list_of_lists):
<do action on item>
itertools.chain(*list_of_lists):
использование from_iterable
только кажется действительно полезным, когда вы хотите, чтобы ленивая оценка работала с итерацией, которая возвращает большое количество значений.
возможно, вы получите сообщение об ошибке, потому что вы использовали диапазон (0,10), но ваш список не содержит 10 записей?
l = [['a', 'b', 'c'], ['d', 'b'], ['e'], ['x', 'y', 'z']]
for i in range (0,len(l)):
for item in l[i]:
print item
a
b
c
d
b
e
x
y
z
Вы также можете использовать что-то вроде этого:
l = [['a', 'b', 'c'], ['d', 'b'], ['e'], ['x', 'y', 'z']]
[val for row in l for val in row]
Или если вам нужно выполнить какое-либо действие:
for val in (val for row in l for val in row):
# do smth
ИЛИ
action = lambda x: str(x)+'_1'
[map(lambda val: action(val), row) for row in l]
ИЛИ
action = lambda x: str(x)+'_1'
map(lambda row: map(lambda val: action(val), row), l)
Ваша ошибка может быть связана с i
больше, чем количество внутренних списков. Чтобы этого избежать, вместо этого вы можете использовать
for inner in list:
for item in inner:
<do action on item>