寻找亚军得分 >> 解释

10
根据参赛者的成绩单,您需要找到第二名的成绩。将得分存储在列表中并找到第二高的得分。 输入格式 第一行包含N。第二行包含一个由N个整数组成的数组,每个整数之间用空格隔开。 我找到了这个解决方案。
n = int(input())

nums = map(int, input().split())    
print(sorted(list(set(nums)))[-2])

有人能解释一下为什么我们在这里使用了map函数吗?

如果有人能解释一下这一行:

nums = map(int, input().split())

如何使用 map 函数 - Sociopath
1
通过应用“int”函数将每个项目转换为整数。例如,num1 = int('1')等等。 - Frederik.L
19个回答

8

因此,我们可以采用这行代码:

nums = map(int, input().split())

并将其分解为几个子部分:

nums_in = input()
nums_split = nums_in.split()
nums = map(int, nums_split)

为了按顺序处理,nums_in 将作为字符串读入数字列表。对于输入字符串 "1 5 73 29",它将是:

nums_in = "1 5 73 29"

nums_split 将是每个数字字符串拆分为一个列表的数字列表:

nums_split = ["1", "5", "73", "29"]

现在,map函数将会在列表中的每个项(在这个例子中是"1", "5", "73", "29")上调用一个函数(在这个例子中是int),并创建一个新的列表,其中包含该函数返回的值。因此,对于这个例子:
nums = [1, 5, 73, 29]

在Python 2中,map函数总是返回一个列表,因此在Python 3中,我们需要添加一步:
nums = list(map(int, nums_split))

或者,可以在两种语言中使用我最喜欢的Python结构之一,即列表推导式

nums = [int(n) for n in nums_split]

1
只是挑剔一点:map会给你一个迭代器,而不是一个列表。 - deceze
哇,这太棒了!我已经为Python 2和3编辑了我的答案。谢谢! - user554538

2

map()函数将给定的函数应用于可迭代对象中的每个项,并返回结果列表。 然后,可以将来自map()的返回值(map对象)传递给诸如list()(创建列表)、set()(创建集合)等函数。

示例1:map()如何工作?

def calculateSquare(n):
    return n*n

numbers = (1, 2, 3, 4)
result = map(calculateSquare, numbers)
print(result)

# converting map object to set
numbersSquare = set(result)
print(numbersSquare)

当您运行该程序时,输出将为:
<map object at 0x7f722da129e8>
{16, 1, 4, 9}

map()函数对可迭代对象中的每个元素执行指定的函数,并将该元素作为参数发送到函数中。

map(function, iterables) 

Map将一个函数应用于输入列表中的所有项目。

大多数情况下,我们希望逐个将所有列表元素传递给函数,然后收集输出。例如:

items = [1, 2, 3, 4, 5]
squared = []
for i in items:
    squared.append(i**2)

Map允许我们以更简单、更好的方式实现这一点。下面是代码示例:

items = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, items))

map不是很符合Python的风格。我建议使用列表推导式代替:

map(f, iterable)

基本上相当于:

[f(x) for x in iterable]

单独使用 map 不能进行笛卡尔积,因为其输出列表的长度总是与输入列表相同。但你可以通过列表推导式轻松完成笛卡尔积:

[(a, b) for a in iterable_a for b in iterable_b]

这个语法有点令人困惑,基本上等同于:

result = []
for a in iterable_a:
    for b in iterable_b:
        result.append((a, b))

1

Map是一个非常简单的内置函数。

因此,它将function应用于可迭代序列即sequence中的每个项目。

map(function, sequence)

所以在您的情况下,nums = map(int, input().split()) input().split()返回一个列表。对于该列表中的每个项,都会应用int函数。

这在语法上等同于

ls = []
for item in items: # here items is the sequence returned by split
    res = int(item)
    ls.append(res)
# ls will be list that the map returns.

所以,通过split()函数分隔的输入中的所有项都被映射到int()函数。因此,所有项都转换为int类型。


1
最Pythonic的方法是使用filter()函数从列表中筛选出第二大的值。
if __name__ == '__main__':
    n = int(input())
    arr = list(map(int, input().split()))

maxv = max(arr)
l = list(filter(lambda x: x != maxv,arr))
print(max(l))

2
这根本没有回答问题。 - Adam Dadvar
@Praneeth - lambda函数是否会获取最大值之前的第二个最大值?如果您可以,请详细说明以下代码行: l = list(filter(lambda x: x != maxv,arr)) - Eugene_S

1
这是我对同一问题的解决方案,使用set()来删除重复项,并使用逆向的sort()找出所需的元素。希望这是最简单的方法来解决这个问题。
if __name__ == '__main__':
    n = int(input())
    arr = map(int, input().split())

    x = set(arr)
    x = list(x)
    x.sort(reverse=True)
    print(x[1])

0
以下是我的解决方案:
if __name__ == '__main__':
    n = int(input()) # Declaring size of array eg: 5 <- 5 values
    arr = map(int, input().split()) # Values in array eg: 1 2 3 4 5
    
    scores = [x for x in arr] # Storing values of array in a list
    print(max([x for x in scores if x!= max(scores)]))

这个想法是创建2个列表:

  • 列表1包括输入数组的所有值。
  • 列表2排除列表1中的最大值,然后我只需打印出列表2中的最大值。

1
arrayscores都不是必需的。只需执行scores = list(map(int, input().split()))即可... - Tomerikoo
你也反复调用了 max(scores)。将其在列表推导式之外调用一次并使用保存的值会更简单... - Tomerikoo

0

我使用排序和函数解决了这个问题,然后我们可以得到最大项之前的亚军分数。

if __name__ == '__main__':
  n = int(input())
  arr = map(int, input().split())

  list =[]
  for val in arr: 
    if val in list: 
     continue 
    else:
      list.append(val)
  sorted = sorted(list)
  print (sorted[-2])

0
result = list(arr)
rem_val = []
max_v = max(result)
for i in result:
    if i < max_v:
    rem_val.append(i)
print(max(rem_val))

从这个指令来看,你需要将arr值转换成列表的形式,因为你的arr值显示为3434543。

0

你也可以用这种方式来实现。首先,我们应该确保没有任何重复值,因此我们将给定的值集合化以去除重复项,然后按降序对其进行排序。接着,我们打印出列表中索引为1的第二高的数值。

if __name__ == '__main__':
    n = int(input())
    arr = map(int, input().split())
    arr_set = set(arr)
    arr_list = list(arr_set)
    arr_list.sort(reverse = True)
    print(arr_list[1])

-1

我发现这个答案是迄今为止最简单和最有效的。

  1. 我将数组转换成了列表。
  2. 将列表转换为集合,以避免重复值。
  3. 然后对集合进行排序。

ordered = sorted(set(list(arr)))

最后,只需打印有序集并请求倒数第二个[-2]值。

print(ordered [-2])


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接