我正在尝试在python中进行基本的合并排序,但每次运行代码时我都会收到错误
” ... 如果x [0]< Y [0]: IndexError:列表索引超出范围 “
而且我不确定我哪里出错了。这是代码:
def merge(x,y):
merged = []
while len(x) > 0 or len(y) > 0:
if x[0] < y[0]: #this is where it is telling me the list index is out of range
merged.append(x[0])
del x[0]
else:
merged.append(y[0])
del y[0]
print merged
s1 = raw_input()
s2 = raw_input()
nums1 = map(int, s1.split())
nums2 = map(int, s2.split())
merge(nums1,nums2)
提前谢谢!
答案 0 :(得分:2)
从x
获取所有元素后,没有x[0]
,但您尝试将其与y[0]
进行比较。如果您先耗尽y
,则没有y[0]
,但您仍尝试将其与x[0]
进行比较。一旦一个列表用尽,您就无法继续进行这些比较。
答案 1 :(得分:0)
您当前的while
语句将在两个列表的 非空(因为or
条件)时运行,但您不会覆盖只有一个是空的。如果一个列表为空,并且您尝试比较每个列表中的第一个列表,则会收到您看到的错误。
例如,请考虑简单列表{1,2}
和{3,4}
。你从:
list 1 = {1,2}, list 2 = {3,4}, merged = {}
你的第一个循环迭代将检查两个列表的第一个元素,并决定它需要使用第一个列表,让你:
list 1 = {2}, list 2 = {3,4}, merged = {1}
你的第二次循环迭代将检查两个列表的第一个元素,并决定它需要再次使用第一个列表,让你:
list 1 = {}, list 2 = {3,4}, merged = {1,2}
你的第三次循环迭代将检查两个列表的第一个元素并落入堆中,因为 第一个列表中没有第一个元素。
解决方案是简单地确保,如果一个列表变空,只需使用另一个列表,而不用检查内容。我过去有两种方法可以做到这一点。
首先,在while循环中,您可以在比较之前检查每个列表是否为空。如果是,请从其他列表中选择。换句话说,伪代码如:
while len(list1) > 0 or len(list2) > 0:
if len(list1) == 0: use list2
elsif len(list2) == 0: use list1
elsif list1[0] <= list2[0]: use list1
else: use list2
第二,这是我倾向于选择的那个,因为在主循环之外使用完成逻辑似乎更清晰,比较列表直到一个为空,然后处理其他列表的其余部分:
while len(list1) > 0 and len(list2) > 0:
if list1[0] <= list2[0]: use list1
else: use list2
while len(list1) > 0: use list1
while len(list2) > 0: use list2
只有一个的最终while
循环才会执行任何操作,因为如果其中一个列表为空,则只能到达该点。
您还可以使用支持传质的语言对其进行优化,因为您知道必须将大块从一个阵列传输到另一个阵列(您不需要一次只执行一个元素)。我指的是类似Python的东西:
dst[28:31] = list2[12:15]
或C的memcpy()
功能。
最后一部分就像:
if len(list1) > 0: use rest of list1
else: use rest of list2
这是一个简单的“或者 - 或者”,因为你知道: