将排序数组合并到单个排序数组中:Python
我想将两个已经排序的数组排序为一个。为此,我正在使用合并排序 错误::索引器错误:列表索引超出范围 我已尝试手动签出此项,但找不到超出范围的阵列。如果我错了,请纠正我将排序数组合并到单个排序数组中:Python,python,Python,我想将两个已经排序的数组排序为一个。为此,我正在使用合并排序 错误::索引器错误:列表索引超出范围 我已尝试手动签出此项,但找不到超出范围的阵列。如果我错了,请纠正我 def merging(list1, list2): m = len(list1) n = len(list2) val = m+n j, k = 0, 0 new =[] for i in range(val): if j<m and k<n:
def merging(list1, list2):
m = len(list1)
n = len(list2)
val = m+n
j, k = 0, 0
new =[]
for i in range(val):
if j<m and k<n:
if list1[j] < list2[k]:
new.append(list1[j])
j += 1
else:
new.append(list2[k])
k += 1
elif j==m:
while i<m+n:
new.append(list2[k])
k += 1
i += 1
else:
while i<m+n:
new.append(list1[j])
j += 1
i += 1
print 'sorted array is:', new
if __name__ == '__main__':
print 'Enter list 1'
l1 = raw_input()
list1 = map(int, l1.split())
print 'Enter list 2'
l2 = raw_input()
list2 = map(int, l2.split())
merging(list1,list2)
def合并(列表1、列表2):
m=len(列表1)
n=len(列表2)
val=m+n
j、 k=0,0
新=[]
对于范围内的i(val):
如果j很抱歉混淆了
问题是您无法更改i的值,因为i在范围(val)内
def合并(列表1、列表2):
m=len(列表1)
n=len(列表2)
val=m+n
j、 k=0,0
新=[]
对于范围内的i(val):
如果j您有两个问题:
当到达elif
或else
情况时,您不会中断
,因此外部循环将继续(而for
循环忽略在循环内部对i
所做的更改);及
您永远不会返回新的
最基本的解决方案是:
def merging(list1, list2):
m = len(list1)
n = len(list2)
val = m+n
j, k = 0, 0
new =[]
for i in range(val):
if j<m and k<n:
if list1[j] < list2[k]:
new.append(list1[j])
j += 1
else:
new.append(list2[k])
k += 1
elif j==m:
while i<m+n:
new.append(list2[k])
k += 1
i += 1
break # stop for loop here
else:
while i<m+n:
new.append(list1[j])
j += 1
i += 1
break # or here
return new # and return the output
def合并(列表1、列表2):
m=len(列表1)
n=len(列表2)
val=m+n
j、 k=0,0
新=[]
对于范围内的i(val):
如果jdef合并(列表1、列表2):
m=len(列表1)
n=len(列表2)
res=[]
a、 b=0,0
当a
以下是一个返回生成器并可用于所有iTerable的版本:
def合并(g1、g2):
i1,i2=iter(g1),iter(g2)
e1,e2=无,无
尝试:
e1=下一个(i1)
e2=下一个(i2)
尽管如此:
如果e1
您能给出它不起作用的列表吗。在某些情况下,这是可行的。无论如何,您确实意识到,当list1的大小大于list2时,simplest可以正常工作,您确实意识到最简单的方法是:l_new=list1+list2;l_new.sort()
我已经说过我不想使用预定义函数!
def merging(list1, list2):
m = len(list1)
n = len(list2)
val = m+n
j, k = 0, 0
new =[]
for i in range(val):
if j<m and k<n:
if list1[j] < list2[k]:
new.append(list1[j])
j += 1
else:
new.append(list2[k])
k += 1
elif j==m:
while i<m+n:
new.append(list2[k])
k += 1
i += 1
break # stop for loop here
else:
while i<m+n:
new.append(list1[j])
j += 1
i += 1
break # or here
return new # and return the output
def merge(l1, l2):
"""Merge the sorted lists into a new, single list."""
i = j = 0
out = []
while True:
if i == len(l1):
out.extend(l2[j:])
break
elif j == len(l2):
out.extend(l1[i:])
break
elif l1[i] <= l2[j]:
out.append(l1[i])
i += 1
else:
out.append(l2[j])
j += 1
return out
def merging(list1, list2):
m = len(list1)
n = len(list2)
res = []
a, b = 0, 0
while a < m and b < n:
if list1[a] < list2[b]:
res.append(list1[a])
a += 1
else:
res.append(list2[b])
b += 1
if a == m:
for i in list2[b:]:
res.append(i)
else:
for i in list1[a:]:
res.append(i)
return res
if __name__ == '__main__':
print 'Enter list 1'
l1 = raw_input()
list1 = map(int, l1.split())
print 'Enter list 2'
l2 = raw_input()
list2 = map(int, l2.split())
print merging(list1,list2)