Причина IndexError
в том, что
В кодовом блоке
if x == []: #checks if a list is empty
list.remove(x) #if empty removes that list
shuffle(list, nlist) #recurs the function
nlist.append(x[0]) #adds 0 index of x to nlist
x.remove(x[0]) #remo
, когда вы проверяете наличие пустого x, после того, как элемент управления возвращается из shuffle(list, nlist) #recurs the function
,nlist.append(x[0])
по-прежнему вызывается с пустым x (потому что он находится в том же блоке кода), вызывая ошибку
Чтобы решить эту проблему (используя существующий код), вы можете просто использовать условие else, чтобы убедиться, чтоblock
nlist.append(x[0]) #adds 0 index of x to nlist
x.remove(x[0])
не выполняется, если x пуст
Что-то вроде
def shuffle(list, nlist): #list is a list of lists to be shuffled
if list: #same as if list != []
for x in list: #runs through lists to be completed
if not x: #same is if x != []
list.remove(x) #if empty removes that list
shuffle(list, nlist) #recurs the function
else:
nlist.append(x[0]) #adds 0 index of x to nlist
x.remove(x[0]) #removes 0 index of x from x
shuffle(list, nlist) #recurs the function until task is complete
else:
print(nlist)
Хорошим способом реализации такой функции было бы использование zip
функция в Python
import itertools
def shuffle(list, nlist):
for values in itertools.izip_longest(*list):
nlist.extend([value for value in values if value])
del list
n= []
shuffle([[1,2,3], [4,5,6], []], n)
print n
Вывод:
[1, 4, 2, 5, 3, 6]
Объяснение:
Функция zip может принимать несколько итераторов (например, список) и возвращатькортеж со следующим значением от каждого из заданных итераторов.Встроенная функция zip
выполняет итерацию только до самого короткого итератора (в данном случае самый короткий список).izip_longest
перебирает самый длинный список и дополняет все пропущенные значения заданным вами выбором (по умолчанию: нет)
A *
перед тем, как структура в python расширяет ее до всех подзначений в контейнере. Например, если a = [1, 2, 3, 4]
custom_func(1, 2, 3, 4)
совпадает с custom_func(*a)
Теперь, поскольку мы дополняем наши дополнительные значения (из-за разницы в длине подсписка), нам нужно только добавить ненулевые значения в наш окончательный список
[value for value in values if value]
принимает следующий кортеж, возвращенный функцией izip_longest(...)
, и удаляет из него все значения None
, добавляя все остальные к nlist
. В конце мы можем удалить объект спискапосле заполнения nlist