为什么我的for循环在for循环中会导致问题?

2024-10-03 19:33:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码,其中我们有两个唯一整数列表,nums1和nums2;其中nums1是nums2的子集。我们希望比较nums1和nums2的每个元素,并用nums2中的下一个最大整数追加“output_stack”

例如: 输入:nums1=[4,1,2],nums2=[1,3,4,2] 输出:[-1,3,-1] 说明: 对于第一个数组中的数字4,您无法在第二个数组中找到下一个更大的数字,因此输出-1。 对于第一个数组中的数字1,它在第二个数组中的下一个较大的数字是3。 对于第一个数组中的数字2,第二个数组中没有下一个更大的数字,因此输出-1

def nextGreaterElement(nums1, nums2):
    nums1 = sorted(nums1)
    nums2 = sorted(nums2)


    output_stack = []
    for i in range(len(nums1)):
        for j in range(len(nums2)):
            if nums1[i] ==nums2[-1]:
                output_stack.append(-1)

            elif nums1[i] == max(nums2):
                output_stack.append(-1)

            elif nums1[i] == nums2[j]:
                output_stack.append(nums2[j+1])

            else:
                output_stack.append(-1)

        return(print(output_stack))

nextGreaterElement([2,4],[1,2,3,4])

上面的代码返回了错误的输出[-1,3,-1,-1],我知道原因-这是因为我用j迭代了所有nums2,但这是我知道如何做的唯一方法。有没有办法修改现行守则

我的问题是,如果我去掉了第二个“for”循环,我很难找到一种方法来引用nums2中的“next”索引;有没有一种不使用“for”循环的方法可以做到这一点


Tags: 方法代码inforoutputstackrange数字
2条回答

我不知道你的代码为什么不起作用,但我想我可以尝试一下自己的版本。可以稍微清理一下,但似乎对您的两个示例有效

def nextGreaterElement(nums1, nums2):
    results = []
    for i in range(len(nums1)):
        greater_numbers = nums2[i:][np.where(nums2[i:] > nums1[i])]
        if len(greater_numbers) > 0:
            results += [greater_numbers[0]]
        else:
            results += [-1]
    return np.array(results)
        

list1 = np.array([4, 1, 2])
list2 = np.array([1, 3, 4, 2])

nextGreater = nextGreaterElement(list1, list2)
print(nextGreater)

下面是代码的工作原理:

首先,我们需要遍历第一个列表中的数字:

for i in range(len(nums1)):

然后,我们希望在与第一个点相同的索引处对第二个列表进行切片。我将使用nums1作为[4,1,2]和nums2作为[1,3,4,2]来执行此示例,查看nums1中的“1”

nums2[i:]

(value 1 is at index 1, nums2[1:] returns array([3, 4, 2]))

查找切片列表中大于我们正在查看的数字的数字的位置

np.where(nums2[i:] > nums1[i])

(at i=1, this returns the index positions (array([0, 1, 2], dtype=int64),) as all of the numbers in [3,4,2] are greater than 1)

然后索引nums2列表以返回实际值

greater_numbers = nums2[i:][np.where(nums2[i:] > nums1[i])]

returns array([3, 4, 2])

在获取列表中的第一个数字之前,我们需要检查数组中是否有任何值

if len(greater_numbers) > 0:
    results += [greater_numbers[0]]
else:
    results += [-1]

将结果作为numpy数组返回以保持一致性。我最初将结果附加到列表中,因为它们是可变的。我不确定这方面的最佳做法是什么,但这是我的做法

return np.array(results)

尝试退出else if结构中的第二个for循环:

    for i in range(len(nums1)):
      for j in range(len(nums2)):
        if nums1[i] ==nums2[-1]:
            output_stack.append(-1)
            break
        elif nums1[i] == max(nums2):
            output_stack.append(-1)
            break
        elif nums1[i] == nums2[j]:
            output_stack.append(nums2[j+1])
            break
        else:
            output_stack.append(-1)
            break
    return(print(output_stack))

相关问题 更多 >