Shuffle Program (ошибка индекса списка вне диапазона) - PullRequest
0 голосов
/ 08 февраля 2019

Я построил эту программу, чтобы брать любое количество списков любого размера и выводить новый список nlist, где все люди в списке отсортированы один за другим в порядке от первого списка до последнего.Примером может быть ввод списков [1,2,3,4] и [5,6,7,8] и вывод [1,5,2,6,3,7,4,8], создающих что-то вроде перемешанного типа.

Мое объяснение этого кода состоит в том, что все перемешиваемые списки будут отдельными лицамибольшой список контейнеров.Программа начинается с оператора if, проверяющего, содержит ли список контейнеров что-либо.Затем он пробегает x списка контейнеров, которые являются списками, которые нужно перетасовать.В этом цикле он проверяет, есть ли в списке x какие-либо лица, и удаляет этот список, если его нет.После этого он добавит первое число x в новый список и удалит его из x.После этого он будет повторяться, чтобы он мог сделать это снова с новым x[0], пока все списки не станут пустыми и все x[0] не будут перетасованы в новый список.

Проблема заключается в том, когдаЯ запускаю это, он приходит с индексом списка из-за ошибки диапазона.Я предполагаю, что это потому, что в конце программы число х заканчивается пустым, но программа регистрирует список контейнеров как полный, потому что он содержит эти пустые списки.Затем он удаляет их из списка и пытается запустить остальную часть программы, но не может, потому что нет ничего, чтобы запустить его.Я верю в это, потому что это в конечном итоге распечатывает перемешанный список, но все равно выдает ошибку.Я попытался исправить это, добавив рекурсию после list.remove(x), чтобы она могла снова запустить программу с удаленным x.

Любые идеи о том, как решить эту проблему?

def shuffle(list, nlist):            #list is a list of lists to be shuffled
    if list:                         #checks for a completed task
        for x in list:               #runs through lists to be completed
            if not 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])           #removes 0 index of x from x
        shuffle(list, nlist)         #recurs the function until task is complete
    else:
        print(nlist)                 #prints end result`enter code here`

1 Ответ

0 голосов
/ 08 февраля 2019

Причина 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

...