gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:21:55 28 4
gpt4 key购买 nike

我构建了这个程序来获取任意数量的任意大小的列表,并输出一个新列表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`

最佳答案

发生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 条件来确保 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)

实现此类函数的一个好方法是使用 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后删除列表对象

关于python - 随机播放程序(列表索引超出范围错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54587608/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com