【问题标题】:'IndexError: list index out of range' during assignment分配期间的“IndexError:列表索引超出范围”
【发布时间】:2016-12-05 17:54:50
【问题描述】:
j = [['4', '5'], ['1', '1'], ['1', '5'], ['3', '4'], ['3', '1']] 
k = [['5', '2'], ['4', '2'], ['2', '4'], ['3', '3'], ['4', '3']]
t = []
indexPointer = 0

for coord in j:
    for number in coord:
        t[indexPointer][0] = number
        indexPointer += 1
indexPointer = 0
for coord in k:
    for number in coord:
        t[indexPointer][1] = number
        indexPointer += 1
print(t)

应该输出:

[[4,5],[5,2],[1,4],[1,2],[1,2],[5,4],[3,3],[4,3],[3,4],[1,3]]

相反,我得到:

t[indexPointer][0] = number
IndexError: list index out of range

我该如何解决这个问题?我试图找到一种方法,但没有任何运气。

编辑: 我没有包含所有必要的代码。已经更新了。

【问题讨论】:

    标签: python list loops indexing


    【解决方案1】:

    你不能索引一个空列表,因为那里什么都没有。您要么必须向其附加内容,要么使用空值预填充它,例如:

    t = [None] * 10
    

    但即使这样也不行,因为您希望t 是二维的。您可能想尝试将 t 设为defaultdict,如下所示:

    from collection import defaultdict
    t = defaultdict(dict)
    t[1][0] = 'a'
    

    【讨论】:

    • 我更新了代码。本来我有点不清楚。也许您可以根据更新的问题帮助我?
    • 同样适用。您不能索引到空列表。你必须要么把它变成一个字典,你可以随意索引,或者用空数据预填充它。
    【解决方案2】:

    为什么不会超出范围?

    您的 t 变量只是一个空的单维列表,您尝试访问它,就好像它是二维的一样。

    我认为您只是想将j 中的所有内容添加到t?在这种情况下,您可以这样做:t = list(itertools.chain(*j))

    编辑:刚刚注意到每个元素都在它自己的列表中:t = [[x] for x in itertools.chain(*j)]

    【讨论】:

    • 我更新了代码。本来我有点不清楚。也许您可以根据更新的问题帮助我?
    【解决方案3】:

    我会推荐 Pythonista 发布的代码,但要调整您的代码以使其工作:

    j = [['4', '5'], ['1', '1'], ['1', '5'], ['3', '4'], ['3', '1']] 
    t = []
    
    for coord in j:
        for number in coord:
            t.append([number])
    
    print(t)
    #[['4'], ['5'], ['1'], ['1'], ['1'], ['5'], ['3'], ['4'], ['3'], ['1']]
    

    当您循环遍历每个元素时,.append 列表方法会将[number] 添加到列表末尾t

    您可以使用list comprehension 完成同样的嵌套循环代码:

    t = [[number] for coord in j for number in coord]
    

    更新:

    既然你更新了你的问题:

    在这种情况下,您应该考虑使用zip 函数。

    t=list(itertools.chain(*zip(j,k)))
    

    如果您想使用for 循环来更新上面的代码,但在这里您可以使用列表.extend 方法:

    j = [['4', '5'], ['1', '1'], ['1', '5'], ['3', '4'], ['3', '1']] 
    k = [['5', '2'], ['4', '2'], ['2', '4'], ['3', '3'], ['4', '3']]
    t = []
    
    for coord in zip(j,k):
        t.extend(coord)
    
    print(t)
    #[['4'], ['5'], ['1'], ['1'], ['1'], ['5'], ['3'], ['4'], ['3'], ['1']]
    

    作为理解:

    t=[i for coord in zip(j,k) for i in coord]
    

    【讨论】:

    • 我更新了代码。本来我有点不清楚。也许您可以根据更新的问题帮助我?
    • @NickWright 我已根据您的更新更新了我的答案
    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 2020-02-03
    • 2018-10-21
    • 2020-02-13
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多