我试图将一个冗长的行列表附加到同一个变量中。它适用于循环中的前几千次迭代(所有这些都具有相同的长度),但是,接近文件的末尾,行变得更短,而我仍然想要追加它们,我我不确定如何处理它。
脚本给出了一个超出范围的错误,正如预期的那样。
以下是有问题的代码部分:
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
对此的任何帮助将不胜感激!
答案 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
)填写nn1
,nn2
,...,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像以前一样创建一个元组列表,除了在输入中的某些行较短的情况下包含填充。