python - 在合并和排序函数中列出超出范围的索引

我尝试在 python 中编写一个简单的合并和排序函数,但在出现以下错误后卡住了-

List out of range. 

如果您能帮助我修复它并弄清楚如何避免它,我将不胜感激。我在下面添加了代码-

def merge(lst1, lst2):
    # Gets two sorted lists and returns one merged and sorted list
    merge_sorted = []
    i = 0
    j = 0
    len1 = len(lst1) - 1
    len2 = len(lst2) - 1
    while i < len1 or j < len2:
        if lst1[i] < lst2[j]:
            merge_sorted.append(lst1[i])
            i += 1
        elif lst1[i] > lst2[j]:
            merge_sorted.append(lst2[j])
            j += 1
        else:
            merge_sorted.append(lst1[i])
            merge_sorted.append(lst2[j])
            i += 1
            j += 1
    return merge_sorted

lst1 = [2, 4, 5, 6, 8]
lst2 = [1, 3, 7, 9, 0]
merge(lst1, lst2)

我得到的:

IndexError                                Traceback (most recent call last)
<ipython-input-13-572aad47097b> in <module>()
     22 lst1 = [2, 4, 5, 6, 8]
     23 lst2 = [1, 3, 7, 9, 0]
---> 24 merge(lst1, lst2)

<ipython-input-13-572aad47097b> in merge(lst1, lst2)
      7     len2 = len(lst2) - 1
      8     while i < len1 or j < len2:
----> 9         if lst1[i] < lst2[j]:
     10             merge_sorted.append(lst1[i])
     11             i += 1

IndexError: list index out of range

最佳答案

你的问题是 while 条件:

while i < len1 or j < len2:

应该是and - 如果任一条件不成立,您只需将非空列表的其余部分附加到您的结果即可。

您当前的代码仍然进入 while-body 并检查 if lst1[i] < lst2[j]:如果 i 之一/j比你得到的错误列表更大。


完整固定代码:

def merge(lst1, lst2):
    # Gets two sorted lists and returns one merged and sorted list
    merge_sorted = []
    i = 0
    j = 0
    len1 = len(lst1) - 1
    len2 = len(lst2) - 1
    while i < len1 and j < len2:         # use and
        if lst1[i] < lst2[j]:
            merge_sorted.append(lst1[i])
            i += 1
        elif lst1[i] > lst2[j]:
            merge_sorted.append(lst2[j])
            j += 1
        else:
            merge_sorted.append(lst1[i])
            merge_sorted.append(lst2[j])
            i += 1
            j += 1

    # add remainder lists - the slices evaluate to [] if behind the list lengths
    merge_sorted.extend(lst1[i:])  # if i is aready out of the list this is []
    merge_sorted.extend(lst2[j:]) # if j is aready out of the list this is []
    return merge_sorted

lst1 = [2, 4, 5, 6, 8]
lst2 = [0, 1, 3, 7, 9]  # fixed input, needs to be sorted, yours was not
print(merge(lst1, lst2))

输出:

[0, 1, 2, 3, 4, 5, 6, 8, 7, 9]

https://stackoverflow.com/questions/67241815/

相关文章:

asp.net-core - 如何在 ASP.NET Core 3.1 中为 Swagger 指定默

azure - 如何删除被不属于我的域锁定的 Front Door 资源

perl - 什么意思 "Can' t locate object method.."在这个使用 P

javascript - 类型错误:无法在 React 项目中读取 null 的属性 'length

r - 使向量的所有元素都不同

reactjs - "Redundant alt attribute. Screen-readers

javascript - 尝试调试 javascript : "vscode listen eacc

dart - 在 Dart 中,给定可空类型 `T?` ,我如何获得不可空类型 `T`

python - 导入错误 : No module named 'typing' when tryi

r - 使用 gsub() 从 R 中的数组中提取数字