【发布时间】:2019-11-19 14:18:01
【问题描述】:
已编辑:
一般问题:使用某个长度为 m*n 的列表的元素,创建一个包含 m 个子列表的列表,每个子列表的长度为 n。
在我的例子中,m > n,并且分别是 10 和 3。
最终输出应该是一个包含十个列表(“nulis”的迭代)的列表(“lis1”),每个列表有三个元素。此外,我当前的算法应该将“lis0”留空。错误在最后一步返回。
我正在解析我使用 CSV 模块生成的一些 CSV 文件(四列 - 一列包含 3 个数字的列表,三列各包含一个关于相应列表的数字)。我无法弄清楚如何更优雅地阅读模块的文档,并且在最后一步遇到了一些麻烦:将列表列中的术语重新组合成 3 元素长的列表(其他列已完成)。
解决方案/解释将是理想的,但如果您有另一种方法,我会采取另一种方法。
我不记得其他一些,但我曾尝试使用“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”打印语句是一个只有一个数字的列表,即原始列表的最后一个元素(仅供参考,有三十个元素)。最后一个“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
任何帮助都会很棒,伙计们!
【问题讨论】:
-
您能否提供一些示例数据以及您的输出应该是什么样的。
-
抱歉,最终输出应该是一个包含十个列表(“nulis”的迭代)的列表(“lis1”),每个列表有三个元素。在我给出的脚本中,“lis0”中有示例数据。我的原始数据是 10 个列表,其中单个数字的三个副本在解析后变成了一个包含 30 个元素的列表。
标签: python list parsing indexoutofrangeexception index-error