【问题标题】:'int' object is not iterable on list'int' 对象在列表中不可迭代
【发布时间】:2019-12-03 13:11:21
【问题描述】:

给定两个列表,都具有 String 元素,编写一个 Python 程序,使用 Python 列表创建一个新字符串,遵循以下规则:

list1 中的第一个元素应与 list2 中的最后一个元素合并,list1 中的第二个元素应与 list2 中的倒数第二个元素合并,依此类推。 如果 list1/list2 中的元素为 None,则另一个列表中的相应元素应保持在合并列表中的状态。

示例输入:

list1=['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
list2=['y','tor','e','eps','ay',None,'le','n']  

预期输出:

“一天一苹果,医生远离我”

我的代码:

 for i,j in range(n,len(list1)):
     a = 1
     j = n - a
     s = list[i]+list[j]
     resultant_data.append(s)
     a=+1 
     n+=1

    return resultant_data

#Provide different values for the variables and test your program
list1=['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
list2=['y','tor','e','eps','ay',None,'le','n']
merged_data=merge_list(list1,list2)
print(merged_data)
 Traceback (most recent call last):
  line 21, in <module>
    merged_data=merge_list(list1,list2)
  line 8, in merge_list
    for i,j in range(n,len(list1)):
 TypeError: 'int' object is not iterable

【问题讨论】:

  • range() 不会产生数字对,只会产生单个数字
  • 请提供正确的函数定义

标签: python arrays python-3.x list


【解决方案1】:

您迭代 2 个索引,因此您需要 2 个范围(可迭代对象)。

类似:

def merge_list(list1, list2):
    resultant_data = []
    list2.reverse()

    for i,j in zip(range(0, len(list1)), range(0, len(list2))):
        if list2[j] is not None:
            s = list1[i]+list2[j]
        else:
            s = list1[i]
        resultant_data.append(str(s))

    return ' '.join(resultant_data)

#Provide different values for the variables and test your program
list1=['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
list2=['y','tor','e','eps','ay',None,'le','n']
merged_data=merge_list(list1,list2)
print(merged_data)

另见https://discuss.codecademy.com/t/loop-two-variables-simultaneously-in-python-3/261808/7

我还删除了 list2 的索引计算,如果你只是反转列表开始,你可以像使用 list1 一样循环遍历它

还有一些改进的空间,例如。如果 list1 还包含 None 值,则需要额外检查...


cmets 之后的更多信息: 在 python3 中,range 函数返回一个范围对象而不是一个列表 (python2)(cfr.Python 3 range Vs Python 2 range) 但是当你将它用于迭代时,这并没有什么不同:

    Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28)
    >>> list1=['a','b']
    >>> range(0, len(list1))
    range(0, 2)
    >>> for i in range(0, len(list1)):
    ...     print(list1[i])
    ...
    a
    b

我在上面输入的代码在 python3 中给出了相同的错误TypeError: 'int' object is not iterable

问题是你想迭代 2 件事并且只提供 1 可迭代 cfr。 object not iterable on treehouse 在这种情况下,没有提供第二个可迭代对象。

当您不提供第二个 iterable 时,它​​将遍历您提供的唯一列表。所以它会认为(见下面的例子) 0 是第一个迭代的东西,1 是第二个迭代的东西,0 和 1 是整数,因此不是可迭代。

>>> for i,j in [0,1]:
...     print i
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> for i,j in [0,1],:
...     print i
...
0

【讨论】:

  • 这看起来像是对错误的正确解释。 @kim-paulissen 这个错误看起来特定于 python2,其中 range 生成一个范围列表,那么 python3 呢,其中 range 给出了一个惰性迭代器?
  • 我用更多信息更新了上面的答案,因为我的评论太长了:-)
【解决方案2】:

如果你想迭代你的两个列表,你可以使用 Python 的内置函数:

words = []
for elt0, elt1 in zip(list1, reversed(list2)):
    w = elt0
    if elt1:
       w += elt1
    words.append(s)
return " ".join(words)

【讨论】:

  • 解释实际问题。
  • 您不能这样做,因为列表中没有任何内容2
  • 你是对的,添加行不适用于None。我的观点只是为了简化迭代而不是处理串联问题。 bharatk 完成了完整的 for 循环。我会更正我的答案
【解决方案3】:

您收到该错误是因为 None 不是字符串,因为它不包含像“None”这样的引号。这就是为什么它被认为是一个整数。所以整数和字符串不能连接。为避免该错误,您需要在连接之前使用 if 条件来检查该索引是否为 None。

list1=['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
list2=['y','tor','e','eps','ay',None,'le','n']
j = -1
sentence = ""
for i in list1:
    if list2[j] != None:
        word = i + list2[j]
    j-=1
    sentence = sentence + word + " "
print(sentence)

【讨论】:

    【解决方案4】:

    or 运算符适用于将 None 合并为一个空字符串。 map 用于将函数应用于两个列表。 lambda 用于创建简单的内联函数,join 用于合并由空格分隔的元素..

    list1=['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
    list2=['y','tor','e','eps','ay',None,'le','n'] 
    
    print(' '.join(map(lambda x, y: (x or '')+(y or ''),list1, list2[::-1])))
    
    An apple a day keeps the doctor away
    

    【讨论】:

    • 问题要求一个列表,但预期的输出是一个字符串。将' '.join 更改为list 以打印列表而不是字符串。
    【解决方案5】:
    • reversed(seq) - Python 的内置函数,它返回一个反向迭代器。
    • strip() - Python 的内置函数用于从字符串中删除所有前导和尾随空格。

    例如

    list1=['A', 'app','a', 'd', 'ke', 'th', 'doc', 'awa']
    list2=['y','tor','e','eps','ay',None,'le','n']
    
    string1 = ""
    for a1,a2 in zip(list1,reversed(list2)):
        if a2 is not None:
            string1 = string1+" "+a1+a2
        else:
            string1 = string1+" "+a1
    
    print(string1.strip())
    

    O/P:

    An apple a day keeps the doctor away
    

    【讨论】:

      【解决方案6】:

      list是保留关键字,我想这应该是正确的sn-p。

       for i,j in range(n,len(list1)):
           a = 1
           j = n - a
           s = list1[i]+list2[j]
           resultant_data.append(s)
           a=+1 
           n+=1
      

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 1970-01-01
        • 2022-01-20
        • 2013-08-02
        • 2012-06-21
        • 1970-01-01
        • 2014-11-04
        • 1970-01-01
        相关资源
        最近更新 更多