随机播放程序(列表索引超出范围错误)

时间:2019-02-08 07:14:01

标签: python list shuffle index-error

我已经构建了该程序以获取任意数量的任何大小的列表,并输出一个新列表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]改组到新列表中为止。

问题是,当我运行此命令时,它出现列表索引超出范围错误。我认为这是因为在程序末尾,x的数量最终为空,但是程序将容器列表注册为已满,因为它包含这些空列表。然后它将它们从列表中删除,并尝试运行该程序的其余部分,但由于没有任何可运行的内容而无法运行。我相信这是因为它最终会打印出混排的列表,但仍然会出现错误。我尝试通过在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 :(得分:1)

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 functionnlist.append(x[0])仍被用空的x调用(因为它在同一代码块中)导致错误

要解决此问题(使用现有代码),您可以简单地使用else条件来确保该块

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)

实现此功能的一种不错的方法是在python中使用zip函数

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遍历最长的列表,并用您给定的选择填充所有缺失的值(默认值:无)

Python中的结构之前的*,将其扩展为容器中的所有子值 例如,如果a = [1, 2, 3, 4] custom_func(1, 2, 3, 4)custom_func(*a)

现在,由于要填充额外的值(由于子列表长度不同),我们只需要将非None值添加到最终列表中即可

[value for value in values if value]提取izip_longest(...)函数返回的下一个元组,并从中删除所有None值,同时将其余所有值附加到nlist

最后,我们可以在填充nlist之后删除列表对象