Доступ к содержимому каждого списка из списка в Python

1

Кажется, это немного запутанно напечатано так, но то, что я хочу, должно быть довольно простым. У меня есть список списков в 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: Я решил свою проблему, используя другую структуру данных. Это было немного сложнее. Извините за то, что тратил свое время, но спасибо за советы в любом случае!

  • 2
    В чем ошибка, трассировка?
  • 2
    Может быть, просто добавить недостающую двоеточие? Если вы действительно покажете нам полный трекбэк, это займет считанные секунды. Отказ от этого - большая трата времени.
Показать ещё 1 комментарий
Теги:
list
loops

6 ответов

5

Это потому, что ваш внешний список имеет только 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

  • 1
    Как примечание, этот метод значительно упрощает циклический просмотр списков. Вам больше не нужно беспокоиться о том, как долго будет длиться список. Использование итераторов в ваших интересах - ключ к идиоматическому питону.
  • 0
    Это действительно полезная заметка. Но в моем случае я не думаю, что причина его сбоя: ошибка появляется, когда я пытаюсь запустить программу. В настоящее время он даже не знает, какой длины список .. Кстати, я отредактировал свое сообщение, предоставив более подробную информацию о том, что я хочу сделать
Показать ещё 1 комментарий
3

Вы ищете

for my_list in list_of_lists:
    for item in my_list:
        # whatever
  • 3
    Также, если вам нужен индекс элемента, не забудьте использовать команду enumerate : for i, my_list in enumerate(list_of_lists):
  • 0
    Спасибо за все быстрые ответы, я понимаю, что не достаточно ясно: я отредактировал свое сообщение
Показать ещё 2 комментария
2

То, что вы хотите, - это цепочка подсписок и повторение. Модуль Itertools имеет функцию для этого и очень прост и эффективен:

for item in itertools.chain.from_iterable(list_of_lists):
   <do action on item>
  • 2
    Или itertools.chain(*list_of_lists): использование from_iterable только кажется действительно полезным, когда вы хотите, чтобы ленивая оценка работала с итерацией, которая возвращает большое количество значений.
2

возможно, вы получите сообщение об ошибке, потому что вы использовали диапазон (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
0

Вы также можете использовать что-то вроде этого:

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)
  • 1
    Понимание вложенного списка и генератора все еще отбрасывает меня из-за того, что конечное значение находится слева, а внутренние циклы идут вправо.
  • 0
    @ JAB я тоже))) Это не самая понятная вещь, я думаю
Показать ещё 3 комментария
0

Ваша ошибка может быть связана с i больше, чем количество внутренних списков. Чтобы этого избежать, вместо этого вы можете использовать

for inner in list:
    for item in inner:
        <do action on item>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню