1

我正在尝试将冗长的行列表附加到同一个变量。它适用于循环中的前一千次左右的迭代(所有迭代都具有相同的长度),但是在文件末尾附近,行变得有点短,虽然我仍然想附加它们,但我我不知道如何处理它。

正如预期的那样,该脚本给了我一个超出范围的错误。

这是有问题的代码部分的样子:

    ii = 0
    NNCat = []
    NNCatelogue = []
    while ii <= len(lines):

        NNCat = (ev_id[ii], nn1[ii], nn2[ii], nn3[ii], nn4[ii], nn5[ii], nn6[ii], nn7[ii], nn8[ii], nn9[ii], nn10[ii], nn11[ii])
        NNCatelogue.append(NNCat)
        ii = ii + 1



    print NNCatelogue, ii

对此的任何帮助将不胜感激!

4

3 回答 3

3

我会回答你没有先问的问题;):这段代码怎么能更像pythonic?

代替

ii = 0
NNCat = []
NNCatelogue = []
while ii <= len(lines):

    NNCat = (ev_id[ii], nn1[ii], nn2[ii], nn3[ii], nn4[ii], nn5[ii], nn6[ii], nn7[ii], nn8[ii], nn9[ii], nn10[ii], nn11[ii])
    NNCatelogue.append(NNCat)
    ii = ii + 1

你应该做

NNCat = []
NNCatelogue = []
for ii, line in enumerate(lines):

    NNCat = (ev_id[ii], nn1[ii], nn2[ii], nn3[ii], nn4[ii], nn5[ii], nn6[ii],
             nn7[ii], nn8[ii], nn9[ii], nn10[ii], nn11[ii])
    NNCatelogue.append(NNCat)

在每次通过期间ii将为您增加一并且line将是当前行。

至于你的短线,你有两个选择

  • None没有实际值时,使用特殊值(如)填写
  • nn1检查, nn2, ...的长度,nn11看它们是否足够大

第二种解决方案将更加冗长、难以维护且令人困惑。我强烈建议None在没有数据时使用(或您自己创建的其他特殊值)作为占位符。

于 2012-10-02T15:04:32.160 回答
1
from itertools import izip_longest
NNCatelogue = list(izip_longest(ev_id, nn1, nn2, ... nn11, fillvalue=None))

有关izip的文档,请参见此处。list如果您不需要它,请帮自己一个忙并跳过迭代器周围。在许多情况下,您可以使用迭代器和列表,这样可以节省大量内存。特别是如果您有很长的列表,那么您将在这里分组。

于 2012-10-02T15:16:23.340 回答
1
def gvop(vals,indx): #get values or padding
    return vals[indx] if indx<len(vals) else None

NNCatelogue = [(gvop(ev_id,ii), gvop(nn1,ii), gvop(nn2,ii), gvop(nn3,ii), gvop(nn4,ii),
                gvop(nn5,ii), gvop(nn6,ii), gvop(nn7,ii), gvop(nn8,ii), gvop(nn9,ii),
                gvop(nn10,ii), gvop(nn11,ii)) for ii in xrange(0, len(lines))]

通过定义此其他函数以返回正确的值或填充,您可以确保行的长度相同。如果 None 不是您想要的,您可以将填充更改为任何内容。

然后列表 comp 像以前一样创建一个元组列表,除了在输入中的某些行较短的情况下包含填充。

于 2012-10-02T15:39:39.297 回答