应该收到:
[[‘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]])
答案 0 :(得分:1)
正如前面的评论中所提到的,python for循环是集合中每个元素的迭代器。而不是C通常使用for循环来生成索引值for (int i = 0; i < X; i++)
,随后用于从某个数组中获取该索引处的值,等效的python代码for i in my_list:
将设置{{1}等于迭代器为该集合或生成器生成的值。由于列表是有序集合,因此您将获得标准的顺序迭代器行为。
考虑到这一点,您可以直接使用i
和i
的值来更正您的代码:
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)。
我希望我帮忙!