【问题标题】:Merging three lists together将三个列表合并在一起
【发布时间】:2013-02-08 08:39:06
【问题描述】:

为了好玩,我正在尝试实现 k 方式合并排序,其中 k =3。递归调用合并排序没有问题,但我试图将三个列表合并在一起,但没有得到排序列表。基本思想是我比较每个列表的第一个元素,如果它是最小的,我将它附加到一个列表中。我对所有数组重复这个过程。

def three_merge(a,b,c):
    i =0
    j =0
    k=0
    list = []
    while(i < len(a) or j < len(b) or k < len(c)):
        while(a[i] <= b[j] and a[i] <= c[k]):
            list.append(a[i])
            i=i+1
            print i
        while(b[j] <= a[i] and b[j] <= c[k]):
            list.append(b[j])
            j=j+1
            print j
        while(c[k] <= a[i] and c[k] <= b[j]):
            list.append(c[k])
            k=k+1
            print k
   return list    

a = [1,2]
b = [-5,10]
c = [-11, 100]
print three_merge(a,b,c)                            

【问题讨论】:

  • 你知道,这可能有一个/两个班轮。 sort(a + b + c) 浮现在脑海中。
  • return list 应该在你的 while 循环中还是在它之后?
  • 我正在尝试不使用内置函数
  • 为什么?这是作业还是什么,或者你只是想让这变得困难?合并一个像 python 喜欢的数组; list1 + list2
  • 您应该编辑您的问题以更具体地了解正在发生的事情,而不是仅仅说您没有得到排序列表。

标签: python merge


【解决方案1】:

问题是您为附加到排序列表的每个值提前了索引i, j, k,这意味着在从列表中获取所有元素后,索引比相应输入列表的长度大一。因此,当您比较不同输入列表的元素值时,您最终会遇到您尝试执行的操作,实际上是a[len(a)],而总是会给出索引错误。

【讨论】:

  • 对我现有的代码进行更改会很乏味。我可能会从头开始重写,因为使用这段代码,我会有一堆 if 语句。
  • @phil12 是的,所以?您当前的设计不起作用,因此需要进行更改。如果它变得丑陋,也许另一种方法会更好。
【解决方案2】:

这是一个简单的 n 路合并函数。如果您有任何问题,请随时提出:

def merge(*args):
    lst = list(args)
    idx = [0] * len(lst)
    out = []

    while lst:
        m = 0
        for i in range(len(lst)):
            if lst[i][idx[i]] < lst[m][idx[m]]:
                m = i
        out.append(lst[m][idx[m]])
        idx[m] += 1
        if idx[m] >= len(lst[m]):
            del lst[m]
            del idx[m]

    return out


print merge([1,2,11], [2,9], [8]) # [1, 2, 2, 8, 9, 11]

【讨论】:

    【解决方案3】:

    为什么不将三个列表的合并视为两个列表的两个合并的组合

    def merge(a,b):
        L = a
        l = b
        i = 0
        j = 0
        res = []
        if (len(b)>len(a)):
            L=b
            l=a
        #print L
        #print l
        while (i<len(L)):
            if(len(l)>0):
                while (j<len(l)):
                    if (L[i]<=l[j]):
                        res.append(L[i])
                        del L[i]
                        break
                    else:
                        res.append(l[j])
                        del l[j]
            else:
                #print res
                res = list(res+L)
                L=[]
                break
        if len(l)>0:
            res = list(res+l)
            l=[]
        return res
    
    def threeMerge(a,b,c):
        return merge(merge(a,b),c)
    
    aa = [1,2]
    bb = [-5,3,20]
    cc= [-11, 23,45]
    print threeMerge(aa,bb,cc)
    

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 2020-11-26
      • 1970-01-01
      • 2020-02-04
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多