![](/img/trans.png)
[英]Python: turn single array of sorted, repeat values into an array of arrays?
[英]Merge sorted arrays into single sorted array: Python
我想將兩個已經排序的數組排序為一個。 我為此目的使用合並排序。
錯誤:: IndexError:列表索引超出范圍
我嘗試手動檢查此,我找不到范圍數組。 如果我錯了請指正我
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)
編輯::我不想使用任何內置函數,如sort()
您有兩個問題:
elif
或else
情況時,您不會break
,因此外循環繼續(而for
循環將忽略對i
在循環內部所做的更改); 和 return new
。 最小修復是:
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
抱歉造成混淆。
問題是您無法更改i的值,因為i在range(val)中。
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:
if k<n:
new.append(list2[k])
k += 1
else:
if j<m:
new.append(list1[j])
j += 1
print "sorted array is:"
print 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 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)
這是一個返回生成器並與所有可迭代對象一起使用的版本:
def merge(g1, g2):
i1, i2 = iter(g1), iter(g2)
e1, e2 = None, None
try:
e1 = next(i1)
e2 = next(i2)
while True:
if e1 < e2:
yield e1
e1 = None
e1 = next(i1)
elif e2 < e1:
yield e2
e2 = None
e2 = next(i2)
else:
yield e1
yield e2
e1, e2 = None, None
e1 = next(i1)
e2 = next(i2)
except(StopIteration):
for ix, ex in ((i1, e1), (i2, e2)):
if ex != None:
yield ex
for e in ix:
yield e
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.