每当我更改列表大小

时间:2015-10-06 01:27:28

标签: python list indexing range reverse

我试图将列表列表旋转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

3 个答案:

答案 0 :(得分:4)

您可以使用ziplist(zip(*reversed(yourlist))) 在一行中轻松完成所做的工作。此答案中下面给出的代码中的实际问题。

示例 -

list(...)

Python 2.x 不需要zip(),因为>>> 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)] 会在 Python 2.x 中返回一个列表。

演示 -

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]]

演示 -

*

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]]

演示 -

<html>
    <div id="outer"> 
    <div id="facebookButton">
    <a href="url"></a>
    </div>
    </div>
</html>

答案 1 :(得分:1)

更改

for i in (range(len(list1)+1))

for i in (range(len(list1)))

它应该有效

答案 2 :(得分:0)

如果您将for i行更改为:

for i in (range(len(list1))):

然后它给出了预期的结果。

请注意,您的代码仅适用于n-by-n列表,而不适用于n-by-m列表

off by one error的典型示例; - )