每次使用if时列表索引超出范围?

2024-10-04 01:34:19 发布

您现在位置:Python中文网/ 问答频道 /正文

v = [1, 3, 5, 6, 8, 10]

f = [2, 4, 7, 9, 11, 12]

def new(v,f):

    i = 0
    j = 0
    u=[0]*12
    for k in range(12):
          if(v[i]<=f[j]):
              u[k]+=v[i]
              i+=1
          elif(f[j]<=v[i]):
                 u[k]+=f[j]
                 j+=1
    print(u)
new(v, f)

回溯(最近一次呼叫):

文件“C:/Users/Matheus/PycharmProjects/untitled/dsfdsfs.py文件“,第15行,in

new(v, f)

文件“C:/Users/Matheus/PycharmProjects/untitled/dsfdsfs.py文件,第8行,纽约

if(v[i]<=f[j]):

索引器错误:列表索引超出范围

我想不出这个错误的原因


Tags: 文件inpynewforifdef错误
3条回答

这是因为列表v和f的长度都只有6。 当代码运行时,i的增量超过5,这会导致错误。你知道吗

如果在for循环中添加try/except块,然后打印 i、j和k的值你将看到失败:

for k in range(12):
    try:
        ....
    except IndexError as err:
        print(err)
        print("i = ", i)
        print("j = ", j)
        print("k = ", k)

当i=5时,执行if语句的第一个分支,i递增为6。在下一个循环中,它尝试比较v[6]和f[j]。这将抛出错误。你知道吗

最好使用while循环,因为您不知道所需的迭代次数。由于python中的列表是可变的,因此使用.append()和.extend()函数将值添加到数组的末尾要容易得多,而不是保留另一个计数器。最后,在while循环的末尾,您可以检查哪个列表已用尽,从而导致循环结束,并将其他列表的其余部分添加到末尾。你知道吗

示例代码:

def new(v,f):

    i = 0
    j = 0
    u = []
    # Compare values until one of the lists is exhausted
    while i < len(v) and j < len(f):
        if(v[i]<=f[j]):
              u.append(v[i])
              i+=1
        elif(f[j]<=v[i]):
              u.append(f[j])
              j+=1
    # Check which list was exhausted and add the rest of the other 
    # list on the end of the new list
    if i >= len(v):
        u.extend(f[j:])
    else:
        u.extend(v[i:])
    print(u)

看起来您正在尝试将两个列表合并为一个排序列表?你知道吗

这会更快:

sorted(v+f)

相关问题 更多 >