为什么我的 Merge 函数给出奇怪的答案?
Why is my Merge function giving weird answers?
我刚刚使用 numpy 数组创建了一个简单的合并函数。代码如下,应该还算可以
很简单,我是不是没有正确实现数组?
import numpy as np
def Merge(leftlist, rightlist):
len1 = len(leftlist)
len2 = len(rightlist)
lfirst = 0
rfirst = 0
merge = 0
newlist = np.empty(len1 + len2, dtype = int)
while lfirst < len1 and rfirst < len2:
if leftlist[lfirst] < rightlist[rfirst]:
newlist[merge] = leftlist[lfirst]
lfirst += 1
merge += 1
else:
newlist[merge] = rightlist[rfirst]
rfirst += 1
merge += 1
return newlist
当我使用 Merge([5,6,9],[1,2,3]) 时,它 returns:
数组([ 1, 2, 3, 173670400, 1667330163,
1701601125]),
而不是数组 ([1,2,3,5,6,9])。不知道有什么问题。
编辑:我应该提一下,在这种情况下,leftlist 和 rightlist 参数也是 numpy 数组。
当您 运行 Merge([5,6,9],[1,2,3])
时,lfirst
保持为 0,因此 leftlist
永远不会读取超出第一个元素的内容(while 循环永远不会说明要做什么具有更大价值的列表)。您看到的随机元素是因为您首先创建了一个空数组。如果你 运行 Merge([5,6,9],[1,2,3])
一次又一次,最后 3 个元素每次都会改变。
我编辑了您的函数以找到您想要的结果(N.B。仅当每个传递的列表已经排序时才排序):
def Merge(left, right):
leftlist, rightlist = [list(left), list(right)]
comparisons = 0
newlist = []
while leftlist or rightlist:
try:
x = leftlist.pop(0) if leftlist[0] < rightlist[0] else rightlist.pop(0)
except:
x = leftlist.pop(0) if leftlist else rightlist.pop(0)
newlist.append(x)
comparisons += 1
return np.array(newlist), comparisons
输出:
Merge([5,6,9],[1,2,3]) # (array([1, 2, 3, 5, 6, 9]), 6)
所以这里有6个比较。
我刚刚使用 numpy 数组创建了一个简单的合并函数。代码如下,应该还算可以 很简单,我是不是没有正确实现数组?
import numpy as np
def Merge(leftlist, rightlist):
len1 = len(leftlist)
len2 = len(rightlist)
lfirst = 0
rfirst = 0
merge = 0
newlist = np.empty(len1 + len2, dtype = int)
while lfirst < len1 and rfirst < len2:
if leftlist[lfirst] < rightlist[rfirst]:
newlist[merge] = leftlist[lfirst]
lfirst += 1
merge += 1
else:
newlist[merge] = rightlist[rfirst]
rfirst += 1
merge += 1
return newlist
当我使用 Merge([5,6,9],[1,2,3]) 时,它 returns:
数组([ 1, 2, 3, 173670400, 1667330163, 1701601125]),
而不是数组 ([1,2,3,5,6,9])。不知道有什么问题。
编辑:我应该提一下,在这种情况下,leftlist 和 rightlist 参数也是 numpy 数组。
当您 运行 Merge([5,6,9],[1,2,3])
时,lfirst
保持为 0,因此 leftlist
永远不会读取超出第一个元素的内容(while 循环永远不会说明要做什么具有更大价值的列表)。您看到的随机元素是因为您首先创建了一个空数组。如果你 运行 Merge([5,6,9],[1,2,3])
一次又一次,最后 3 个元素每次都会改变。
我编辑了您的函数以找到您想要的结果(N.B。仅当每个传递的列表已经排序时才排序):
def Merge(left, right):
leftlist, rightlist = [list(left), list(right)]
comparisons = 0
newlist = []
while leftlist or rightlist:
try:
x = leftlist.pop(0) if leftlist[0] < rightlist[0] else rightlist.pop(0)
except:
x = leftlist.pop(0) if leftlist else rightlist.pop(0)
newlist.append(x)
comparisons += 1
return np.array(newlist), comparisons
输出:
Merge([5,6,9],[1,2,3]) # (array([1, 2, 3, 5, 6, 9]), 6)
所以这里有6个比较。