Python:列表索引超出范围 - while / for循环

时间:2015-03-07 14:10:53

标签: python list

我有一个清单

abc = ['date1','sentence1','date2','sentence2'...]

我想对句子做情绪分析。之后,我想将结果存储在一个看起来像这样的列表中:

xyz =[['date1','sentence1','sentiment1'],['date2','sentence2','sentiment2']...]

为此,我尝试了以下代码:

def result(doc):
    x = 2
    i = 3
    for lijn in doc:
        sentiment = classifier.classify(word_feats_test(doc[i]))
        xyz.extend(([doc[x],doc[i],sentiment])
        x = x + 2
        i = i + 2

len(abc)约为7500.我从x开始为2,i开始为3,因为我不想使用列表的前两个元素。

我继续将错误'列表索引超出范围',无论我尝试什么(而对于循环......)

有人可以帮帮我吗?谢谢!

4 个答案:

答案 0 :(得分:1)

正如评论中提到的那样 - 我们无法帮助您在没有堆栈跟踪的情况下在代码中查找错误。但很容易解决你的问题:

xyz = []
def result(abc):
    for item in xrange(0, len(abc), 2): # replace xrange with range in python3
        #sentiment = classifier.classify(word_feats_test(abc[item]))
        sentiment = "sentiment" + str(1 + (item + 1) / 2) 
        xyz.append([abc[item], abc[item + 1], sentiment])

您可能希望阅读有关使程序员轻松生活的built-in函数。 (如果范围已经存在,为什么还要担心增量?)

#output
[['date1', 'sentence1', 'sentiment1'],
 ['date2', 'sentence2', 'sentiment2'],
 ['date3', 'sentence3', 'sentiment3'],
 ['date4', 'sentence4', 'sentiment4'],
 ['date5', 'sentence5', 'sentiment5']]

答案 1 :(得分:0)

试试这个

i =0
for i in xrange(0,len(doc) -1)
    date = doc[i]
    sentence = doc[i + 1]
    sentiment = classifier.classify(word_feats_test(sentence))
    xyz.append([date,sentence,classifier])

只需要一个索引。重要的是知道何时停止。

另外,请查看extend和append

之间的区别

最后,我建议您将数据存储为字典列表而不是列表列表。这使您可以按字段名称而不是索引来访问项目,从而使代码更清晰。

答案 2 :(得分:0)

如果您希望一次列表中有两个元素,则可以使用生成器然后将元素传递给分类器:

abc = ["ignore","ignore",'date1','sentence1','date2','sentence2']

from itertools import islice


def iter_doc(doc, skip=False):
    it = iter(doc)
    if skip: # if  skip is set, start from index doc[skip:]
         it = iter(islice(it, skip, None))
    date, sent = next(it), next(it)
    while date and sent:
        yield date, sent
        date, sent = next(it, ""), next(it, "")


for d, sen in result(abc, 2): # skip set to to so we ignore first two elements
    print(d, sen)

date1 sentence1
date2 sentence2

因此,要创建列表列表xyz,您可以使用列表解析:

xyz = [ [d,sen,classifier.classify(word_feats_test(sen))] for d, sen in iter_doc(abc, 2)]

答案 3 :(得分:0)

很简单。你可以尝试一下:

>>> abc = ['date1','sentence1','date2','sentence2'...]    
>>> xyz = [[ abc[i], abc[i+1], "sentiment"+ str(i/2 + 1)] for i in range(0, len(abc), 2) ]
>>> xyz
output : [['date1', 'sentence1', 'sentiment1'], ['date2', 'sentence2', 'sentiment2'], .....]