Допустим есть вот такой кортеж:
>>> a = ([1,2],[3,4])
Извлечь из него вложенные списки очень просто:
>>> for i in a:
print (i)
[1, 2]
[3, 4]
А вот при таком варианте извлекаются отдельные элементы:
>>> for i,j in a:
print (i,'--',j)
1 -- 2
3 -- 4
Т.е. пара i и j действует как единица, сначала связываясь с первым вложенным списком, затем со вторым.
Что будет, если количество элементов во вложенных списках не одинаково?
>>> b = ([1,2],[3,4,5])
>>> for i,j in b:
print(i,j)
1 2
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
for i,j in b:
ValueError: too many values to unpack (expected 2)
>>> for i,j,k in b:
print(i,j,k)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
for i,j,k in b:
ValueError: need more than 2 values to unpack
Возникает ошибка ValueError: слишком много значений к распаковке (ожидается 2) или требуется больше 2 значений к распаковке. Выйти из положения можно путем использования вложенного цикла for:
>>> for i in b:
for j in i:
print(j,end=' ')
1 2 3 4 5
Более интересный пример, который поможет понять, как работает функция os.walk():
>>> d = [('string',[1,2,3,4],[5,6,7]),('string2',[11],[0,12,13,14,15])]
>>> for i,j,k in d:
print(i,'--',j,'--',k)
string -- [1, 2, 3, 4] -- [5, 6, 7]
string2 -- [11] -- [0, 12, 13, 14, 15]
>>> c = []
>>> for i,j,k in d:
for n in k:
c.append(n)
>>> c
[5, 6, 7, 0, 12, 13, 14, 15]
Внешний цикл for делает две итерации, т.к. в списке d два элемента (в данном случае, кортежа). При каждой итерации переменная i связывается с первым элементом очередного кортежа, переменная j – со вторым, а k – с третьим.