【问题标题】:list indices must be int, not str. But I want them to be str列表索引必须是 int,而不是 str。但我希望他们成为 str
【发布时间】:2014-03-26 04:05:11
【问题描述】:
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 在列表中?有人可以解释我做错了什么吗?

【问题讨论】:

  • if gr == str(answers[line]): ?你可能想要:if line in answers:
  • 我想你是说如果文件的第一行是B,那么你想得分。如果第二行是D,则得分。一般来说,如果文件的第 n 行是answers 中的第 n 个条目,则得分。从该规范开始,您可以开始编写代码。
  • 我想检查 gr 是否等于索引 #line 处“答案”列表中的字符串字符..
  • 是的,Raymond 这就是我想做的,但我希望我编写的代码能够完成这项任务。你能展示一下更好的方法吗?

标签: python list indices


【解决方案1】:

当您使用for line in testA: 遍历文件时,line 变量会获得一个字符串,其中包含文件中的一行。

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

幸运的是,这在 Python 中很简单,使用 enumerate():

for line_number,line_contents in enumerate(testA):
    gr = str(line_contents )
    if gr == str(answers[line_number]):

当迭代某些东西时,enumerate 将为您提供 indexitem,用于迭代中的每个项目。


注意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

【讨论】:

    【解决方案2】:

    我们来看看有问题的部分

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

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

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

    【讨论】:

      【解决方案3】:

      结合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)
      

      【讨论】:

        【解决方案4】:

        我不能 100% 确定您使用的语言,但对于大多数编程语言,列表的索引从 0 开始。这意味着您必须根据您想要的值检查数组的第 0 个条目。

        在大多数语言中,例如 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 中的标签,但我传达的一般含义应该仍然主要。

        【讨论】:

        • 难道我不能只使用[line + 1]而不是[line],因为文本文件的第一行将作为第一行处理?
        • 我相信在这种情况下'line'是指存储在行中的值,而不是行号本身。您可以使用另一个整数变量,并且每次都执行 int++ 操作。
        【解决方案5】:

        假设答案的长度和 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()
        

        【讨论】:

        • 不要使用* 来突出显示代码段!改为添加#comment,或保留有效语法的内容!
        • 正如其他海报所说,它需要gr = str(line).strip()..所以如果@user3366963不想使用enumeratezip,你也可以使用这个counter..
        猜你喜欢
        • 2017-01-27
        • 2016-02-09
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-09
        相关资源
        最近更新 更多