"列表索引必须是整数,而不是str"

时间:2015-11-09 08:37:15

标签: python python-3.x append

应该收到:

[[‘a’, ’m’], [’a’, ’n’], [‘b’, ’m’], [’b’, ’n’], [’c’, ’m’], [’c’, ’n’]]

收到邮件错误:

TypeError: list indices must be integers, not str

代码

for i in lst1:
    for j in lst2:
        cartesian_list.append([lst1[i], lst2[j]])

2 个答案:

答案 0 :(得分:1)

正如前面的评论中所提到的,python for循环是集合中每个元素的迭代器。而不是C通常使用for循环来生成索引值for (int i = 0; i < X; i++),随后用于从某个数组中获取该索引处的值,等效的python代码for i in my_list:将设置{{1}等于迭代器为该集合或生成器生成的值。由于列表是有序集合,因此您将获得标准的顺序迭代器行为。

考虑到这一点,您可以直接使用ii的值来更正您的代码:

j

但是,通过itertools在python中有一个更简单的快捷方式:

cartesian_list.append([i, j])

输出:

from itertools import product
cartesian_list = list(product('abc', 'mn'))
print(cartesian_list)

答案 1 :(得分:1)

如果迭代Python中的列表,变量(在本例中为:i和j)将被赋予传递给它的可迭代对象的每个元素。

查看您的代码和输出的假设我想这些列表是定义的:

lst1 = ['a', 'b', 'c']
lst2 = ['m', 'n']
cartesian_list = []

请记住,两个列表中的每个元素都是一个字符串。

在你的代码中,你试图获取lst1的索引i(其中我是一个字符串!)。这是不可能的。 &#39;类型错误&#39;你看到的只是Python告诉你我(和j,就此而言)是一个字符串。它应该是一个像这样使用的整数。

有两种主要方法可以解决这个问题:

for i in lst1:
    for j in lst2:
        cartesian_list.append([i, j])

这样您只需更改代码的一小部分。 解决这个问题的另一种方法是让i和j迭代索引,就像你打算做的那样。

for i in range(len(lst1)):
    for j in range(len(lst2)):
        cartesian_list.append([lst1[i], lst2[j]])

使用这种方法,我将迭代理论列表[0,1,2 ... len(lst1)-1]。 Range()排除了给定的最后一个值,因此只使用len()是安全的(当最后一个索引为2时,它会给出3)。

我希望我帮忙!