有这么几组数据需要你处理:
James 2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22
Julia 2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21
Mikey 2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38
Sarah 2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55
这是他们四个人跑600米花费的时间,现在需要用python实现找到每个选手跑得最快的三个时间。
首先,自然是分解数据,用split(",")得到列表。然后排序,说道排序,python里有两种排序方法:
1.原地排序:列表方法sort()排序完成后会替换掉原来的数据,原有顺序会消失
2.复制排序:内置函数sorted(),复制原有数据,在排序完成后返回,原有数据和顺序依然保留
打开IDLE试试下面的代码:
>>> data=[1,2,7,5,3,8] >>> sorted(data) >>> data.sort() >>> data
那么接下来试试给上面的选手数据排序吧。
排序结果肯定不行,因为没有处理列表里的数据,仔细看数据,有2-34,3:21,2.34这些符号不同,所以要先统一符号。
统一成数字吧,这样最方便排序了。想想前面学的的东西,要怎么处理呢?关键字:循环、替换
def sanitize(timestr): if ("-" in timestr) or (":" in timestr): return timestr.replace("-", ".").replace(":", ".") else: return timestr newdata=[] def sortdata(data): for item in data: newdata.append(sanitize(item))
return newdata
print(sorted(newdata))
这里用到了两个新概念:
1.方法串链,学过js应该很熟悉了,c#也可以,但比较少用。所谓方法串链简单来说就是调用一个方法后用返回值直接调用下一个方法,所以没有返回值的方法串链会出错的。另外方法串链的顺序是自左向右。如:timestr.replace("-", ".").replace(":", ".")就是先调用replace替换-,返回的字符串再调用replace替换:
2.函数串链,同方法串链,但函数串链是从右向左执行,如:print(sorted(newdata))先用sorted函数对newdata排序,然后print函数打印
另外sort()和sorted()默认都是升序排列,如果需要降序,则需要传入参数reverse=True
如果你嫌循环的代码太多的话(这也叫多?)可以使用列表推导:
def sortdata(data): newdata = [sanitize(item) for item in data]
# 首先是转换 使用循环表示所有项都进行转换 最后返回列表 return newdata
你可以试试列表推导,比如将列表里的所有值乘以2,转换列表大小写等等。列表推导真的非常强大。不过也不是完满无缺,列表推导会转换列表内的所有值,所以如果你只想改变符合条件的值,还是用循环迭代吧
好了,排序完成,就可以取出前3的数据了,还记得吗newdata[0,3](再啰嗦一下:包含左边不含右边)
但还有一个问题:重复项。可以用循环判断,但这样太麻烦了,python已经给我们提供了集合来解决问题。
集合里的数据是不允许重复的,如果想往集合里添加重复项,集合会忽略。
result=set(newdata)
创建集合用set()函数,把列表里的数据放入集合,他会自动帮你去除重复项,然后在进行排序取前3,这里你能自己解决吗?
总结:
1.原地排序:排序后替换,复制排序:排序后返回,参数reverse=True可以实现降序排序
2.方法串链:从左至右,对数据应用一组方法,函数串链:从右至左,对数据应用一组函数
3.如果要转换整个列表里的值,可以使用列表推导
4.访问列表里的多个数据项可以使用分片mylist[3,6](含左不含右)
5.使用set()可以创建一个集合,集合是不允许重复数据项的