合并排序列表索引超出范围

时间:2013-12-06 00:38:48

标签: python python-2.7

我正在尝试在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)

提前谢谢!

2 个答案:

答案 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

这是一个简单的“或者 - 或者”,因为你知道:

  • 列表中至少一个是空的,否则你仍然在主循环中;和
  • 您知道其他列表非空,因为您每次只从一个列表中提取元素。