每当我更改列表大小时,列表索引超出范围
list index out of range, whenever I change the list size
我正在尝试将列表列表旋转 90 度。例如,更改为:
[[1,2,3], [4,5,6], [7,8,9]]
到
[[7,4,1], [8,5,2],[9,6,3]]
视觉上:
[[1,2,3], [[7,4,1],
[4,5,6], --> [8,5,2],
[7,8,9]] [9,6,3]]
每当我将列表大小时更改为更多或更少的元素时,它总是说索引超出范围?到底是怎么回事?
def rotate(list1):
bigList = [] #create a list that we will append on to
for i in (range(len(list1)+1)): #loop through the list looking at the indexes
newList = []
for j in reversed(range(len(list1))): #reverse that list
newList.append(list1[j][i])
bigList.append((newList)) #append the elements to the bigList reversed
return bigList
改变
for i in (range(len(list1)+1))
到
for i in (range(len(list1)))
它应该可以工作
可以使用 reversed
和 zip
在一行中轻松完成您正在做的事情。此答案下方给出的代码中的实际问题。
例子-
list(zip(*reversed(yourlist)))
您不需要 list(...)
用于 Python 2.x,因为 zip()
returns 列表在 Python 2.x .
演示 -
>>> list(zip(*reversed([[1,2,3], [4,5,6], [7,8,9]])))
[(7, 4, 1), (8, 5, 2), (9, 6, 3)]
>>> list(zip(*reversed([[1,2,3,4], [5,6,7,8], [9,10,11,12]])))
[(9, 5, 1), (10, 6, 2), (11, 7, 3), (12, 8, 4)]
如果你想要一个列表的列表,而不是元组的列表,你可以使用列表理解(或 map(list, zip(*reversed(....)))
)。例子-
[list(x) for x in zip(*reversed(yourlist))]
演示 -
>>> [list(x) for x in zip(*reversed([[1,2,3], [4,5,6], [7,8,9]]))]
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
>>> [list(x) for x in zip(*reversed([[1,2,3,4], [5,6,7,8], [9,10,11,12]]))]
[[9, 5, 1], [10, 6, 2], [11, 7, 3], [12, 8, 4]]
*
是 unpacking 的语法,因此 reversed()
返回的列表被解包到 zip()
并作为单独的参数传递给它。
然后 zip()
函数将其每个参数的元素组合在其相应的索引处(比如所有第一个参数在一起,所有第二个参数在一起,等等),因此我们得到了我们需要的结果。
原始代码的实际问题是由于以下行 -
for i in (range(len(list1)+1)):
你循环到 len(list1) + 1
,因此最终你尝试访问像 list1[0][len(list1)]
这样的元素,但在你的情况下不存在。
假设 list1
的子列表都具有相同数量的元素,那么您真正需要的是 len(list1[0])
。例子-
def rotate(list1):
bigList = [] #create a list that we will append on to
for i in (range(len(list1[0]))): #loop through the list looking at the indexes
newList = []
for j in reversed(range(len(list1))): #reverse that list
newList.append(list1[j][i])
bigList.append((newList)) #append the elements to the bigList reversed
return bigList
演示 -
>>> def rotate(list1):
... bigList = [] #create a list that we will append on to
... for i in (range(len(list1[0]))): #loop through the list looking at the indexes
... newList = []
... for j in reversed(range(len(list1))): #reverse that list
... newList.append(list1[j][i])
... bigList.append((newList)) #append the elements to the bigList reversed
... return bigList
...
>>> rotate([[1,2,3], [4,5,6], [7,8,9]])
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
>>> rotate([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
[[9, 5, 1], [10, 6, 2], [11, 7, 3], [12, 8, 4]]
如果将 for i
行更改为:
for i in (range(len(list1))):
然后它给出了预期的结果。
请注意,您的代码仅适用于 n×n 列表,不适用于 n×m 列表
off by one error 的典型例子;-)
我正在尝试将列表列表旋转 90 度。例如,更改为:
[[1,2,3], [4,5,6], [7,8,9]]
到
[[7,4,1], [8,5,2],[9,6,3]]
视觉上:
[[1,2,3], [[7,4,1],
[4,5,6], --> [8,5,2],
[7,8,9]] [9,6,3]]
每当我将列表大小时更改为更多或更少的元素时,它总是说索引超出范围?到底是怎么回事?
def rotate(list1):
bigList = [] #create a list that we will append on to
for i in (range(len(list1)+1)): #loop through the list looking at the indexes
newList = []
for j in reversed(range(len(list1))): #reverse that list
newList.append(list1[j][i])
bigList.append((newList)) #append the elements to the bigList reversed
return bigList
改变
for i in (range(len(list1)+1))
到
for i in (range(len(list1)))
它应该可以工作
可以使用 reversed
和 zip
在一行中轻松完成您正在做的事情。此答案下方给出的代码中的实际问题。
例子-
list(zip(*reversed(yourlist)))
您不需要 list(...)
用于 Python 2.x,因为 zip()
returns 列表在 Python 2.x .
演示 -
>>> list(zip(*reversed([[1,2,3], [4,5,6], [7,8,9]])))
[(7, 4, 1), (8, 5, 2), (9, 6, 3)]
>>> list(zip(*reversed([[1,2,3,4], [5,6,7,8], [9,10,11,12]])))
[(9, 5, 1), (10, 6, 2), (11, 7, 3), (12, 8, 4)]
如果你想要一个列表的列表,而不是元组的列表,你可以使用列表理解(或 map(list, zip(*reversed(....)))
)。例子-
[list(x) for x in zip(*reversed(yourlist))]
演示 -
>>> [list(x) for x in zip(*reversed([[1,2,3], [4,5,6], [7,8,9]]))]
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
>>> [list(x) for x in zip(*reversed([[1,2,3,4], [5,6,7,8], [9,10,11,12]]))]
[[9, 5, 1], [10, 6, 2], [11, 7, 3], [12, 8, 4]]
*
是 unpacking 的语法,因此 reversed()
返回的列表被解包到 zip()
并作为单独的参数传递给它。
然后 zip()
函数将其每个参数的元素组合在其相应的索引处(比如所有第一个参数在一起,所有第二个参数在一起,等等),因此我们得到了我们需要的结果。
原始代码的实际问题是由于以下行 -
for i in (range(len(list1)+1)):
你循环到 len(list1) + 1
,因此最终你尝试访问像 list1[0][len(list1)]
这样的元素,但在你的情况下不存在。
假设 list1
的子列表都具有相同数量的元素,那么您真正需要的是 len(list1[0])
。例子-
def rotate(list1):
bigList = [] #create a list that we will append on to
for i in (range(len(list1[0]))): #loop through the list looking at the indexes
newList = []
for j in reversed(range(len(list1))): #reverse that list
newList.append(list1[j][i])
bigList.append((newList)) #append the elements to the bigList reversed
return bigList
演示 -
>>> def rotate(list1):
... bigList = [] #create a list that we will append on to
... for i in (range(len(list1[0]))): #loop through the list looking at the indexes
... newList = []
... for j in reversed(range(len(list1))): #reverse that list
... newList.append(list1[j][i])
... bigList.append((newList)) #append the elements to the bigList reversed
... return bigList
...
>>> rotate([[1,2,3], [4,5,6], [7,8,9]])
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
>>> rotate([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
[[9, 5, 1], [10, 6, 2], [11, 7, 3], [12, 8, 4]]
如果将 for i
行更改为:
for i in (range(len(list1))):
然后它给出了预期的结果。
请注意,您的代码仅适用于 n×n 列表,不适用于 n×m 列表
off by one error 的典型例子;-)