大家好,小弟目前刚自学Python,由于怕自己金鱼脑,解完了上一个解到下一个时就忘记了,便想到使用写文章的方式,一方面记录自己的思维思考,另一方面后续複习时也比较能回到当时的思考逻辑。
由于文章中会有许多疑问与自我解答,加上小弟是初学者,如有问题建议直接发问会比较快获得正确解答QQ
当然如果大大们有找到我内容中的错误点,希望能够跟小弟说一下(Orz
(如果有引用,内容会是搜寻到的答案)
目前第一天,卡在HackerRank的Basic Data Types的Finding the percentage问题
题目为提交N分数,将N分数存为list并找到第二名,并且2<=n<=10
以下为初始的程式码
if __name__ == '__main__': n = int(input()) arr = map(int, input().split())
首先看到后,我的想法是map是什么?以及我该怎么找出亚军?还有split的用法
map用法: map(function,list)
将「list 的全部内容」完成「对应的 function」
从而得知,原始程式码是将input().split()这个内容,完成对应的int() function
但之前有学过,int(内容)可以将内容整数化,那为什么不直接int(input().split())?
于是我便开始尝试
n = int(input().split())print((n))
得到的错误为
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'
找寻报错的原因,其中找到了
使用 int() 函式进行强制型别转换时,要求引数x必须是字串、位元组物件、数字,不能是其它的型别
可是input不是str的资料型态吗?为什么不能int
所以我开始尝试找到input()与input().spilt()这两个资料型态
n = input()print(type(n))
输入1 2 3 4 5得出了是str
n = input().split()print(type(n))
输入1 2 3 4 5得出了是list
所以当使用者(我)input进去的东西,会是str的资料型态,而当分割后,则会形成一个list
list并不在int的型态转换里面,所以会报错!
那map是什么呢?
他能够快速的帮助我们将「list 的全部内容」完成「对应的 function」
所以map的用法map(function,list)是指将list的内容完成function
接下来我就开始思考,int不是型态吗?为什么在这边他会是function?
int() 函数用于将一个字符串或数字转换为整型。
原来int是一个资料型态,int()是一个函数!
到这边,我就懂了初始的原始码是在干嘛
原来是在将输入的n分数整数化!
那,该怎么找出亚军呢?
我原本的想法是,list可以更改,并且有max可以找出最大值
那我是不是能将list中的最大值找出来并remove掉,接着在执行一次max,这样是不是就找到了亚军?
n = int(input())arr = map(int, input().split())arrmax = max(arr)arr.remove(arrmax)print(arr)
报错了AttributeError: 'map' object has no attribute 'remove'
找了一下这个报错,得到了在python3中,map不会返回列表,而是返回一个迭代器对象
好的..有看没有懂,于是将迭代器google了一下,得到了以下解答
remove是使用在list上,而map他返回的不是list,而是里面的map里面的元素
假设以下程式码,input进去1 2 3 4 5,则map返回的会是1 2 3 4 5,而不是list
arr = map(int, input().split())
那我该怎么找出亚军呢?
我想到了迭代器是否也跟list一样,有remove的方式可以移除
但是当我google了迭代器移除,我得知了迭代器并不能够被移除的(但有特殊办法可以)
到这边后我就卡住了,因为所学中,目前尚未学习到迭代器的删减
透过讨论区后,发现有使用转换资料型态完成代码的的部分,在这边目前就先使用此方式
等待后续学习到迭代器后,再重返这题并完成该题题目。
讨论区中的编码
if __name__ == '__main__': n = int(input()) arr = map(int, input().split()) arr = sorted(list(set(arr))) print(arr[-2])