为什么 max 函数不能在我的代码中打印正确的输出?

why max function does not print proper output in my code?

在下面的代码中,用户每次输入 N 对输入。当用户输入值 2 时,最近的元组将被删除,值 3 打印剩余元组的第二个元素的最大值。假设输入列表是B=[(1,4),(1,37),2,3,(1,29),3]。因此,2 将删除 (1,37)。然后 (1,4) 保留在列表中,然后 3 打印 (1,4) 的值 4。通过输入 (1,29) 剩余列表将是 ([1,4],[1,29]) 并且代码应该打印元组中第二个元素的最大值 29 但它打印 4 而不是 29.

所以预期的输出是:

4
29

但是我的代码输出是:

4
4
N = int(input())
inputs = []
for i in range(N):
    inputs.append(input().split())
B = []
for b in inputs:
    if len(b) == 2:
        B.append(b)
    if b == ['2']:
        del B[-1]  
    if b == ['3']:
        print(max(B,key=lambda x:x[1])[1])

简单更正:

'4' > '29' 但 4 < 29

所以:

print(max(B,key=lambda x:x[1])[1]) 应该是 print(max(B,key=lambda x:int(x[1]))[1])

或者,更好的方法是在输入时将字符串转换为整数,这样您的 lambda 函数就会正确。

最有效的方法(我能想到的)

此代码应提供卓越的性能。彻底测试它:

N = int(input())
inputs = [[int(x) for x in input().split()] for _ in range(N)]

max_values = []
B = []
for t in inputs:
    if len(t) == 2:
        B.append(t)
        v = t[1]
        if not max_values or v >= max_values[-1]: # if it's smaller, it can never be a maximum value
            max_values.append(v)
    elif t == [2]:
        item = B.pop() # remove last element
        v = item[1]
        if v == max_values[-1]:
            max_values.pop()
    else:
        assert t == [3]
        print(max_values[-1])

检查元素是否为元组并检查不带引号的整数或列表

#N = int(input())
#inputs = []
inputs = [(1,4),(1,37),2,3,(1,29),3]
#for i in range(N):
#    inputs.append(input().split())

B = []
for b in inputs:
    if type(b) == tuple:
        B.append(b)
    if b == 2:
        del B[-1]  
    if b == 3:
        print(max(B,key=lambda x:x[1])[1])

输出

4
29