在合并和排序函数中列出超出范围的索引
list index out of range in a merge and sort function
我尝试在 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]
这是 if
条件之前的 i, j 的值-
0 0
0 1
1 1
1 2
2 2
3 2
4 2
4 3
5 3
当任何列表遍历到最后时,它抛出 index out of range error
。
解决方案-
不使用 or
条件,而是使用 and
条件并将剩余的列表元素追加到排序列表的末尾。
正如其他技术人员所建议的那样,您可以修改 运行 程序,但您只是增加了程序的时间复杂度,您可以分两行完成。
只需扩展 list1 元素,如
list1.extend(list2)
一旦元素进入列表1
print(set(sorted(list1)))
首先,你的逻辑是错误的!您正在选择较低的数字并将它们放入列表中。但是最大的数字呢?你会被困在那里!因为你永远不会选择最后一个!
我改变了逻辑。我没有计算迭代器,而是删除了挑选出来的迭代器!当一个列表为空时,另一个列表的其余部分将加入最终列表。
其次,不要为您的函数使用“合并”名称!被占用了!
def merger(l1, l2):
merge_sorted = []
t1, t2 = sorted(l1), sorted(l2)
while len(t1) != 0 and len(t2) != 0:
if t1[0] <= t2[0]:
merge_sorted.append(t1[0])
t1 = t1[1:]
else:
merge_sorted.append(t2[0])
t2 = t2[1:]
return merge_sorted + (t1 if len(t1) != 0 else t2)
lst2 = [2, 4, 5, 6, 8]
lst1 = [1, 3, 7, 9, 0, 10]
print(merger(lst1, lst2))
我尝试在 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]
这是 if
条件之前的 i, j 的值-
0 0
0 1
1 1
1 2
2 2
3 2
4 2
4 3
5 3
当任何列表遍历到最后时,它抛出 index out of range error
。
解决方案-
不使用 or
条件,而是使用 and
条件并将剩余的列表元素追加到排序列表的末尾。
正如其他技术人员所建议的那样,您可以修改 运行 程序,但您只是增加了程序的时间复杂度,您可以分两行完成。
只需扩展 list1 元素,如
list1.extend(list2)
一旦元素进入列表1
print(set(sorted(list1)))
首先,你的逻辑是错误的!您正在选择较低的数字并将它们放入列表中。但是最大的数字呢?你会被困在那里!因为你永远不会选择最后一个!
我改变了逻辑。我没有计算迭代器,而是删除了挑选出来的迭代器!当一个列表为空时,另一个列表的其余部分将加入最终列表。
其次,不要为您的函数使用“合并”名称!被占用了!
def merger(l1, l2):
merge_sorted = []
t1, t2 = sorted(l1), sorted(l2)
while len(t1) != 0 and len(t2) != 0:
if t1[0] <= t2[0]:
merge_sorted.append(t1[0])
t1 = t1[1:]
else:
merge_sorted.append(t2[0])
t2 = t2[1:]
return merge_sorted + (t1 if len(t1) != 0 else t2)
lst2 = [2, 4, 5, 6, 8]
lst1 = [1, 3, 7, 9, 0, 10]
print(merger(lst1, lst2))