Python 谜题:列表分区:为什么索引超出范围?
Python puzzle: partitions of lists: Why is the index out of range?
已编辑:
一般问题:使用一些长度为 m*n 的列表的元素,创建一个包含 m 个子列表的列表,每个子列表的长度为 n。
在我的例子中,m > n,分别为 10 和 3。
最终输出应该是一个列表 ("lis1"),其中包含十个列表("nulis" 的迭代),每个列表包含三个元素。此外,我当前的算法应该将 "lis0" 留空。在最后一步返回错误。
我正在解析我使用 CSV 模块生成的一些 CSV
文件(四列 - 一列包含 3 个数字,三列各包含一个数字)。我无法弄清楚如何更优雅地阅读模块的文档并在最后一步遇到一些问题:将列表列中的术语重新组合为 3 元素长的列表(其他列已完成)。
solution/explanation 将是理想的选择,但如果您有其他方法,我将采用另一种方法。
我不记得其他一些,但我曾尝试使用“for j in list: while (j == list[list.index(j)+1])
或 (j == list[list.index(j)-1]): newlist.append(j)
”,但出现了内存错误。解决方案虽然不那么相关,但会很贴心,因为它只适用于我正在研究的特殊情况(由于我正在编写的另一个脚本中的不足而有效)。
在当前版本中,我尝试了'break
'(提前结束了一步,但有一个相同类型的被忽视的错误),'continue
'和'pass
',以没有用。
将脚本编辑成一个给出相同错误的函数,请随意给出特殊情况(即上面列出的问题的任何解决方案,m=10,n=3)
def lispart(lis,length,depth):
l0 = list(lis)
l1 = []
if ((len(l0)%length) != 0) or ((len(l0)%depth) != 0):
return "Parity Error: length and/or depth do not correspond to list"
else:
for i in range(int(len(l0)/depth)):
for j in range(depth):
nulis = [l0[j] for j in range(depth)]
l1.append(nulis)
for k in nulis:
if k in l0:
l0.remove(l0[l0.index(k)])
print(lispart([i for i in range(30)], 10, 3))
我认为问题是因为没有足够的元素来完成新列表的制作。
最终,当你 运行 它像我一样写出最后一个非空的“lis0
”打印语句是一个只有一个数字的列表,即原始列表的最后一个元素(fyi ,有三十个元素)。最后一个“lis1
”打印有 9 个元素,下一个(最后一个 "nulis")元素的公式是正确的,但我不知道它是否被附加,因为在其他任何事情之前最终会出现错误印刷。
Traceback (most recent call last):
File "script.py", line X, in <module>
nulis = [lis0[j] for j in range(3)]
File "script.py", line X, in <listcomp>
nulis = [lis0[j] for j in range(3)]
IndexError: list index out of range
伙计们,任何帮助都会很棒!
由 David C. Ullrich 和 Peter Foreman 根据堆栈交换数学设计:
def lispart(lis,depth):
lish = list(lis)
assert(len(lish)%depth == 0)
return [lish[j*depth:(j+1)*depth] for j in range((int(len(lish)/depth)))]
已编辑:
一般问题:使用一些长度为 m*n 的列表的元素,创建一个包含 m 个子列表的列表,每个子列表的长度为 n。
在我的例子中,m > n,分别为 10 和 3。
最终输出应该是一个列表 ("lis1"),其中包含十个列表("nulis" 的迭代),每个列表包含三个元素。此外,我当前的算法应该将 "lis0" 留空。在最后一步返回错误。
我正在解析我使用 CSV 模块生成的一些 CSV
文件(四列 - 一列包含 3 个数字,三列各包含一个数字)。我无法弄清楚如何更优雅地阅读模块的文档并在最后一步遇到一些问题:将列表列中的术语重新组合为 3 元素长的列表(其他列已完成)。
solution/explanation 将是理想的选择,但如果您有其他方法,我将采用另一种方法。
我不记得其他一些,但我曾尝试使用“for j in list: while (j == list[list.index(j)+1])
或 (j == list[list.index(j)-1]): newlist.append(j)
”,但出现了内存错误。解决方案虽然不那么相关,但会很贴心,因为它只适用于我正在研究的特殊情况(由于我正在编写的另一个脚本中的不足而有效)。
在当前版本中,我尝试了'break
'(提前结束了一步,但有一个相同类型的被忽视的错误),'continue
'和'pass
',以没有用。
将脚本编辑成一个给出相同错误的函数,请随意给出特殊情况(即上面列出的问题的任何解决方案,m=10,n=3)
def lispart(lis,length,depth):
l0 = list(lis)
l1 = []
if ((len(l0)%length) != 0) or ((len(l0)%depth) != 0):
return "Parity Error: length and/or depth do not correspond to list"
else:
for i in range(int(len(l0)/depth)):
for j in range(depth):
nulis = [l0[j] for j in range(depth)]
l1.append(nulis)
for k in nulis:
if k in l0:
l0.remove(l0[l0.index(k)])
print(lispart([i for i in range(30)], 10, 3))
我认为问题是因为没有足够的元素来完成新列表的制作。
最终,当你 运行 它像我一样写出最后一个非空的“lis0
”打印语句是一个只有一个数字的列表,即原始列表的最后一个元素(fyi ,有三十个元素)。最后一个“lis1
”打印有 9 个元素,下一个(最后一个 "nulis")元素的公式是正确的,但我不知道它是否被附加,因为在其他任何事情之前最终会出现错误印刷。
Traceback (most recent call last):
File "script.py", line X, in <module>
nulis = [lis0[j] for j in range(3)]
File "script.py", line X, in <listcomp>
nulis = [lis0[j] for j in range(3)]
IndexError: list index out of range
伙计们,任何帮助都会很棒!
由 David C. Ullrich 和 Peter Foreman 根据堆栈交换数学设计:
def lispart(lis,depth):
lish = list(lis)
assert(len(lish)%depth == 0)
return [lish[j*depth:(j+1)*depth] for j in range((int(len(lish)/depth)))]