【问题标题】:Python puzzle: partitions of lists: Why is the index out of range?Python 谜题:列表分区:为什么索引超出范围?
【发布时间】: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


【解决方案1】:

由来自堆栈交换数学的 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)))]

【讨论】:

  • 更简单:[lish[j:j+depth] for j in range(0, len(lish), depth)].
  • 是的,这基本上是彼得给出的,我修改它以结合他们的两个想法。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 2020-09-04
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
相关资源
最近更新 更多