【问题标题】:Python: TypeError: list indices must be integers, not strPython:TypeError:列表索引必须是整数,而不是 str
【发布时间】:2014-11-16 09:06:54
【问题描述】:

我将在 Python 上进行矩阵加法。(未完成)。但它显示一个错误。

m, n = (int(i) for i in raw_input().split())
a = [[0 for i in range(m)] for j in range(n)]
b = [[0 for i in range(m)] for j in range(n)]
c = []
total = []

for i in range(m):
    x = raw_input()
    for j in range(n):
        value = [int(i) for i in x.split()]
    c[i][j] = a[i][j]
    #c.append(value)
print a
for i in c:
    print i

我要输入

3 3

1 2 3 >

3 2 1 > 矩阵 A

1 3 2 >

1 1 1 >

1 1 1 > 矩阵 B

1 1 1 >

并显示为

2 3 4 >

4 3 2 > 矩阵 A + B

2 4 3 >

【问题讨论】:

  • 尝试将value = [int(i) for i in x.split()]更改为value = [int(k) for k in x.split()]?您在 for 循环中使用 i + 在列表理解中。
  • 由于0是不可变对象,可以简化为a = [ [0]*m for j in range(n) ]

标签: python matrix typeerror python-2.x


【解决方案1】:

您在外部for 循环中使用i,它是一个int。然后在循环中你有:

value = [int(i) for i in x.split()]

这使得i 成为一个字符串(这是split 返回的内容)。也许您认为[ ] 内部存在某种范围?没有。您有名称冲突,请更改其中之一。

【讨论】:

  • +1 请注意,Python 3 确实为推导式创建了一个新范围。
  • @chepner:很好发现。
【解决方案2】:

您在内部 for 循环中使用相同的变量。

for i in range(m):
    x = raw_input()
    for j in range(n):
        # variable i is refering to outer loop
        value = [int(p) for p in x.split()]
    c[i][j] = a[i][j]
    #c.append(value)
print a
for i in c:
    print i

【讨论】:

    【解决方案3】:

    除了前两个答案之外,您将对此陈述有疑问:

    c[i][j] = a[i][j]
    

    当循环开始时,i 将为 0,到目前为止还可以,但 c 是一个空列表,并且在第一个位置没有可迭代对象,因此 c[0][0] 将返回错误。 摆脱它并取消注释以下行:

    #c.append(value)
    

    编辑:

    您的代码不会返回您想要的。你最好做这样的事情来创建一个给定边的矩阵:

    for i in range(m):
        d = []
        for j in range(n):
            x = raw_input()
            d.append(int(x))
         c.append(d)
    

    如果 mn 都有 3,那么您将创建边长为 3 x 3 的矩阵,并保存在变量 c 中。 这样您就不必拆分用户输入。用户可以一次给出一个数字。您甚至可以更改以下行:

    x = raw_input()
    

    到:

    x = raw_input("{0}. row, {1}. column: ".format(i+1, j+1))
    

    试试看!

    【讨论】:

      【解决方案4】:
      import time
      m, n = (int(i) for i in raw_input().split())
      a = []
      b = []
      total = [[0 for i in range(n)] for j in range(m)]
      
      for i in range(m):
          x = raw_input()
          for j in range(n):
              value = [int(i) for i in x.split()]
          a.append(value)
      #print a
      
      
      for i in range(m):
          x = raw_input()
          for j in range(n):
              value = [int(i) for i in x.split()]
          b.append(value)
      #print b
      
      
      for i in range(m):
          for j in range(n):
              total[i][j] = a[i][j] + b[i][j]
      
      
      for i in total:
          print ' '.join(map(str, i))
      time.sleep(2)
      

      好的!我刚刚想通了!谢谢

      【讨论】:

        【解决方案5】:

        如果您声明一个 int 并将其视为 dict,您也可能会遇到此错误

        >>> a = []
        >>> a['foo'] = 'bar'
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        TypeError: list indices must be integers, not str
        

        【讨论】:

          猜你喜欢
          • 2015-09-02
          • 2017-01-27
          • 2016-02-09
          • 2017-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-09
          相关资源
          最近更新 更多