将不同长度的行附加到同一个变量

时间:2012-10-02 14:30:30

标签: python append

我试图将一个冗长的行列表附加到同一个变量中。它适用于循环中的前几千次迭代(所有这些都具有相同的长度),但是,接近文件的末尾,行变得更短,而我仍然想要追加它们,我我不确定如何处理它。

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

以下是有问题的代码部分:

    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

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

3 个答案:

答案 0 :(得分: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将为您增加1,line将成为当前行。

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

  • 当您没有真正的价值时,请使用特殊值(例如None)填写
  • 检查nn1nn2,...,nn11的长度以确定它们是否足够大

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

答案 1 :(得分:1)

from itertools import izip_longest
NNCatelogue = list(izip_longest(ev_id, nn1, nn2, ... nn11, fillvalue=None))

请参阅此处documentation of izip。如果你不需要它,请帮自己一个忙,跳过迭代器周围的list。在许多情况下,您可以使用迭代器和列表,并节省大量内存。特别是如果你有很长的名单,你就是在这里一起分组。

答案 2 :(得分: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))]

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

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