【问题标题】:AttributeError: 'int' object has no attribute 'split'AttributeError:“int”对象没有属性“split”
【发布时间】:2015-04-30 10:50:05
【问题描述】:

我正在 python 中进行合并排序,但我遇到了问题。当我尝试从控制台插入列表(每行一个数字,返回字符串列表)时,我无法将其转换为整数。你能帮我理解这个问题吗?

import sys

def mergeSort(lista):
    res = []
    for i in lista[0].split():
        res.append(int(i))
    if len(res)>1:
        mid = len(res)//2
        lefthalf = res[:mid]
        righthalf = res[mid:]
        mergeSort(lefthalf)
        mergeSort(righthalf)
        i=0
        j=0
        k=0
        while i<len(lefthalf) and j<len(righthalf):
            if lefthalf[i]<righthalf[j]:
                res[k]=lefthalf[i]
                i=i+1
            else:
                res[k]=righthalf[j]
                j=j+1
            k=k+1

        while i<len(lefthalf):
            res[k]=lefthalf[i]
            i=i+1
            k=k+1

        while j<len(righthalf):
            res[k]=righthalf[j]
            j=j+1
            k=k+1
    print(res)

alist = []
for l in sys.stdin:
    alist.append(l.strip())
mergeSort(alist)

代码错误说:AttributeError: 'int' object has no attribute 'split' 输入是一个文件(使用命令从 shell 给出:“python3 merge.py

【问题讨论】:

  • 这意味着lista 中的第一项是int 对象,而不是字符串。不知何故,您的代码正在将一个整数附加到您传入的列表中。所以这不能是一个完整的代码示例......
  • 但它们都是一个单元字符串...
  • 您的代码显示使用str.split() 的唯一位置是在表面上包含字符串的列表元素上。您可能没有查看您正在运行的相同代码,或者您没有在此处发布您正在运行的相同代码。
  • 我可以发誓代码是一样的。当我尝试输出“lista”时,它返回:'1\r3\r4\r56\r65\r3\r4\r3\r2\r9\r10'
  • 我现在仔细检查一下。当您递归调用mergeSort 时,您传递的是整数列表而不是字符串列表。您应该在 mergeSort 例程之外处理从字符串到整数的转换。

标签: python


【解决方案1】:

如果你也想要索引,可以使用enumerate

data = ['itemA', 'itemB', 'itemC', 'itemD']
for (i, item) in enumerate(data):
    print("Item #%d is %s" % (i, str(item)))

为了将来参考,您可以像这样调试:

def mergeSort(lista):
    res = []
    print(lista)
    for i in lista[0].split():
        print(i)
        res.append(int(i))

【讨论】:

  • 添加打印语句以在循环开始之前查看变量lista 的内容,以及在每次迭代开始时查看i 的内容——它们可能不是您所期望的。
  • 确实不是我想要的输出。 lista 的输出是 '1\r3\r4\r56\r65\r3\r4\r3\r2\r9\r10' (这就是我使用 split 的原因)并且我无法输出 'i' 因为循环
【解决方案2】:

您在mergeSort 例程的顶部将字符串列表转换为整数列表。随后对mergeSort 的递归调用尝试做同样的事情,除了现在对整数列表。

您应该完全独立于 mergeSort 例程处理所有文件解析,该例程应该被设计为仅用于处理数字列表。这是“关注点分离”。

【讨论】:

  • 完全正确。我做了更正。我应该把更正后的代码放在楼上吗?
  • 如果你愿意。对于未来的读者来说,查看这两个版本或至少查看相关更新可能会更好(不一定是两个完整版本的代码,因为合并排序细节无关紧要)。
【解决方案3】:

应该是for i in lista而不是for i in lista[0].split(),你可以简单地通过列表理解来实现:res = [int(num) for num in lista]

【讨论】:

  • 我已经这样做了,我收到错误:int() 以 10 为底的无效文字:'1\r3\r4\r56\r65\r3\r4\r3\r2\r9\r10 '
  • 这就是我拆分的原因
  • @user28011994 你确定你的data.txt是每行一个数字吗?看起来您的 alist 仅包含 1 个元素,其中包含所有数字,这很奇怪。
  • 我把它写成每行 1 个数字
【解决方案4】:

您在 Python 2 中运行此代码,并且您只输入了一个数字。如果是这样,请将 input 替换为 raw_input,它应该可以工作。

【讨论】:

    【解决方案5】:

    AttributeError: 'int' 对象没有属性 'split'

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 2021-04-05
      • 2017-07-02
      • 2016-01-31
      • 2016-09-19
      • 2020-09-14
      • 2021-07-25
      • 2019-03-18
      • 1970-01-01
      相关资源
      最近更新 更多