【问题标题】:Why is my loop not iterating over the 2nd same value in the list?为什么我的循环没有迭代列表中的第二个相同的值?
【发布时间】:2021-09-25 19:54:15
【问题描述】:

我正在创建一个函数来将列表中的两个最大值相乘。

例如:nums = [5,2,5,4]

这里我的结果应该是 25 将 5(索引 0)乘以 5(索引 2)。

但它给了 20。

为什么它不迭代或不考虑此列表中的下 5 个,即索引 2 的 5 个?

def max_pair_product_fast(nums):
    num1 = max(nums)
    print("Maximun = ", num1, "Index = ",nums.index(num1))
    num2 = 0
    for i in nums:
        if  nums.index(num1) != nums.index(i) and num2 < =  i :
            num2 = i
            print("Num 2 : ",num2)

    return num1 * num2

nums = [5,2,5,4]

print("Multiplication = ",max_pair_product_fast(nums))

输出:

PS D:\Code> & C:/Users/kshar/AppData/Local/Microsoft/WindowsApps/PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0/python.exe d:/Code/Algo/mppf.py


Maximun =  5 Index =  0

Num 2 :  2

Num 2 :  4

Multiplication =  20

如果我删除条件nums.index(num1) != nums.index(i),那么它只会将最大值(在本例中为 5)与自身相乘。

【问题讨论】:

  • index(i) 返回值i 第一次 出现的索引。因此,您的方法不适用于重复的最大值,

标签: python list algorithm loops if-statement


【解决方案1】:

发帖者是在问他的原始代码有什么问题,而不是简单地要求一个新代码块而没有任何解释。

这行代码可能导致问题

if  nums.index(num1) != nums.index(i) and num2 <= i:

使用您的示例,列表为 [5,2,5,4]

num1 是您的第一个最大值 5。此 5 的索引为 0。但是,您的第二个最大值也是 5。此 5 的索引为 2。

当您编写 nums.index(i) 时,您希望程序知道第二个 5 在索引 2 处,但是,nums.index() 函数将返回第一次出现的数字。因此,本次迭代时nums.index(5)的值仍为0。

因此,您的程序会忽略此 5,因为 nums.index(5) 始终为 0,等于 num1 的索引。

试试下面这个可以避免这个问题:

def max_pair_product_fast(nums):
num1 = max(nums)
print("Maximun = ", num1, "Index = ",nums.index(num1))
num2 = 0
for index in range(len(nums)):
    if  nums.index(num1) != index and num2 <= nums[index]:
        num2 = nums[index]
        print("Num 2 : ",num2)

return num1 * num2

【讨论】:

  • 你说的很对,但是不同的人有不同的方法,每个人的想法也不同。您的方法也正确,您还可以建议更多更好的方法以及您的答案。
  • @RinshanKolayil 我同意,但我的意思是,许多其他答案只是上传代码而没有任何解释。不同的方法当然很好,如果它们能解释最初出了什么问题,那么提出问题的人就会得到改进。
【解决方案2】:

您也可以通过从列表中删除第一个最大的元素来做到这一点。

def max_pair_product_fast(nums):
num1 = max(nums)
print("Maximun = ", num1, "Index = ",nums.index(num1))
nums.remove(num1)
num2 = max(nums)
return num1 * num2

【讨论】:

  • 谢谢,先生,但我有点在我的代码/方法中寻找问题,而不是新的解决方案或算法。但是,仍然感谢您提供如此有价值的方法。
【解决方案3】:
def max_pair_product_fast(nums):
    nums.sort(reverse=True)
    return nums[0]*nums[1]
    # OR
    # nums.sort()
    # return nums[-1]*nums[-2]
    

nums = [5,2,5,4]
print("Multiplication = ",max_pair_product_fast(nums))

【讨论】:

  • 谢谢,先生,但我有点在我的代码/方法中寻找问题,而不是新的解决方案或算法。但是,仍然感谢您提供如此有价值的方法。 (我会考虑在下一个算法中也使用这个)?
【解决方案4】:

你可以这样做:

def max_pair_product_fast(nums):
    num1 = max(nums)
    print("Maximun = ", num1, "Index = ",nums.index(num1))
    num2 = 0
    nums.remove(num1);
    print (nums)
    num2=max(nums)
    return num1 * num2

nums = [5,2,5,4,6,7,6]

print("Multiplication = ",max_pair_product_fast(nums))

【讨论】:

  • 谢谢,先生,但我有点在我的代码/方法中寻找问题,而不是新的解决方案或算法。但是,仍然感谢您提供如此有价值的方法。
猜你喜欢
  • 2023-01-27
  • 2021-10-16
  • 2022-06-14
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多