list indices必须是int,而不是str。但我希望他们是str

时间:2014-03-26 04:05:12

标签: python list indices

def main():
    score = 0
    answers = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
    testA = open('newfile.txt', 'r')
    for line in testA:
        gr = str(line)
        if gr == str(answers[line]):
            score+=1
    testA.close()
    checkpass(score)

def checkpass(score):
        if score >= 15:
            print("You passed")
        else:
            print("You failed")
main()

我试图编写一些^代码,它接受一个文本文件并将其条目与上面记录的列表进行比较。如果文本文件中的字母与同时索引处的列表中的字母相同,则累加器应添加一个。为什么我不能检查列表中A == A或B == B?有人可以解释我做错了吗?

5 个答案:

答案 0 :(得分:3)

当您使用for line in testA:迭代文件时,line变量会从文件中获取包含一行的字符串

但是,您尝试将此字符串用作answers列表(answers[line])的索引。如果每行应该按顺序与答案匹配,则需要逐个索引到answers列表中。这意味着您要将数字 用作索引:answers[line_number]

幸运的是,使用enumerate()

在Python中这很简单
for line_number,line_contents in enumerate(testA):
    gr = str(line_contents )
    if gr == str(answers[line_number]):

当迭代某些内容时,enumerate将为迭代中的每个项目提供索引


请注意,line_contents已经是一个字符串,因此str()强制转换中没有任何意义。此外,由于您要将每个字符与单个字符进行比较,因此您可能希望从输入文件中删除任何空格。我们可以通过调用str.strip()

来实现这一目标
for line_number,line_contents in enumerate(testA):
    gr = line_contents.strip()
    if gr == str(answers[line_number]):

使用文件时,最好在with块中使用它们。这可以确保文件自动关闭,即使在执行过程中出现问题:

with open('newfile.txt', 'r') as testA:
    for line_number,line_contents in enumerate(testA):
        gr = line_contents.strip()
        if gr == str(answers[line_number]):
            score += 1

答案 1 :(得分:1)

让我们看一下有问题的部分

    for line in testA:
        gr = str(line)
        if gr == str(answers[line]):
            score+=1

linestr类型,与您可能习惯的Javascript不同,for在python中构造返回,而不是的。所以你可以使用enumerate来提供一个方便的索引,你可以像其他答案一样引用答案。但是,有一个更好的构造,zip,这将允许你这样做:

    for answer, line in zip(answers, testA):
        if answer == line.strip():  # strip off the trailing newline
            score += 1

答案 2 :(得分:1)

合并zipsum可以简化此功能

def main():
    answers = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
    with open('newfile.txt', 'r') as testA:
        score = sum(i.strip() == j for i, j in zip(testA, answer))
    checkpass(score)

答案 3 :(得分:0)

我对你正在使用的语言不是100%肯定,但对于大多数编程语言,列表从0开始编制索引。这意味着你必须根据你想要的值检查数组的第0个条目。 / p>

在大多数语言中,例如c ++,语法相当容易使用(您可能必须转换为您正在使用的语言。

用于检查值的C ++语法:     //如果你愿意,忽略'char'部分,那不是Python的一部分(我相信)。     char someArray [] = {'a','b','c'...}; //创建列表,添加随机数量的元素

if (someArray[0] == 'a) // This checks to make sure the 0th entry is 'a' before continuing
{
    ... Do something ...
}

基本上索引告诉你要在数组中评估的位置,所以它需要一个整数来执行此操作。如果你想传递一个字符串,它就不会有你所说的任何线索。

编辑:我在标签上看到它是用Python编写的,但我传达的一般含义应该仍然适用。

答案 4 :(得分:0)

假设答案的长度和testA中的行相等,则为索引器添加一个计数器,如下所示:

def main():
    score = 0
    answers = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
    testA = open('newfile.txt', 'r')
    counter = 0 #initialize counter
    for line in testA:
        gr = str(line)
        if gr == answers[counter]:
            score+=1
        counter += 1 #increment counter
    testA.close()
    checkpass(score)

def checkpass(score):
        if score >= 15:
            print("You passed")
        else:
            print("You failed")
main()