一:編寫程序
現(xiàn)如今有4組秒表記錄的數(shù)據(jù),分別如下:
james.txt:2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22
julie.txt:2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21
mikey.txt:2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38
sarah.txt:2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55
1.需要從各個文件將數(shù)據(jù)讀入各自的列表,編寫一個小程序,處理每個文件,為每個數(shù)據(jù)創(chuàng)建一個列表,并在屏幕上顯示這些列表
james.txt
In [1]: with open('james.txt',"r") as jam: ...: data=jam.readline() ...: james=data.strip().split(",") #strip():去除空白換行符#split():分割(也是最快將元素轉(zhuǎn)換成列表的方法) ...: In [2]: james #變量jamesOut[2]: ['2-34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22'] In [3]: cat james.txt #james.txt下的內(nèi)容2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22
julie.txt
In [4]: with open("julie.txt","r") as ju: ...: data=ju.readline() ...: julie=data.strip().split(",") ...: In [5]: julie Out[5]: ['2.59', '2.11', '2:11', '2:23', '3-10', '2-23', '3:10', '3.21', '3-21'] In [6]: cat julie.txt2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21
mikey.txt
In [7]: with open("mikey.txt","r") as mi: ...: data=mi.readline() ...: mikey=data.strip().split(",") ...: In [8]: mikey Out[8]: ['2:22', '3.01', '3:01', '3.02', '3:02', '3.02', '3:22', '2.49', '2:38'] In [9]: cat mikey.txt2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38
sarah.txt
In [12]: with open("sarah.txt","r") as sa: ...: data=sa.readline() ...: sarah=data.strip().split(",") ...: In [13]: sarah Out[13]: ['2:58', '2.58', '2:39', '2-25', '2-55', '2:54', '2.18', '2:55', '2:55'] In [14]: cat sarah.txt2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55
二:排序的兩種方式
原地排序:sort()方法 升序
降序:sort(reverse=True)
復制排序:sort() BIF升序
降序:sorted(reverse=True)
In [15]: data=[2,3,4,543221,333,1,2,3,2] In [16]: data #原數(shù)據(jù)Out[16]: [2, 3, 4, 543221, 333, 1, 2, 3, 2] In [17]: data.sort()#原地排序(升序)In [18]: data Out[18]: [1, 2, 2, 2, 3, 3, 4, 333, 543221] In [19]: data=[2,3,4,543221,333,1,2,3,2] In [20]: data2=sorted(data) #復制排序In [21]: data Out[21]: [2, 3, 4, 543221, 333, 1, 2, 3, 2] In [22]: data2 Out[22]: [1, 2, 2, 2, 3, 3, 4, 333, 543221] In [24]: data.sort(reverse=True) #原地排序(降序)In [25]: data Out[25]: [543221, 333, 4, 3, 3, 2, 2, 2, 1]
1.給julie排序
In [32]: julie Out[32]: ['2.59', '2.11', '2:11', '2:23', '3-10', '2-23', '3:10', '3.21', '3-21'] In [33]: julie2=sorted(julie) In [34]: julie2 Out[34]: ['2-23', '2.11', '2.59', '2:11', '2:23', '3-10', '3-21', '3.21', '3:10'] In [35]: julie Out[35]: ['2.59', '2.11', '2:11', '2:23', '3-10', '2-23', '3:10', '3.21', '3-21']#ps:該段代碼還需修改
從上段代碼結(jié)果可以看出:1..數(shù)據(jù)格式不統(tǒng)一導致排序錯誤(2-33居然在2.11前面)
思路:1.創(chuàng)建一個函數(shù),這個函數(shù)從每個秒表數(shù)據(jù)的列表中接收一個字符串作為輸入,然后處理這個字符串,將找到的所有短橫線和冒號替換成一個點號,并返回清理過的字符串
2.創(chuàng)建一個空列表,將清理過的數(shù)據(jù)放在該列表中,然后進行排序.
注意:如果字符串已經(jīng)包含一個點好,則不需要在做清理
2.修改為(james的正常排序):
In [55]: james#原數(shù)據(jù)Out[55]: ['2-34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22'] In [56]: clean_james=[]#創(chuàng)建一個空列表In [57]: clean_james Out[57]: []#定義一個轉(zhuǎn)換數(shù)據(jù)格式的方法(將其中你給的:-都變成.)In [58]: def sanitize(time_string): ...: if '-' in time_string: ...: splitter="-" ...: elif ":" in time_string: ...: splitter=":" ...: else: ...: return time_string ...: (mins1,secs1)=time_string.split(splitter) ...: return(mins1+"."+secs1) ...: #循環(huán)james列表,將他變成(分.秒)形式狗,添加到clean_james列表中In [59]: for i in james: ...: clean_james.append(sanitize(i)) ...: print(clean_james) ...: print(sorted(clean_james))#對該列表進行排序 ...: ['2.34', '3.21', '2.34', '2.45', '3.01', '2.01', '2.01', '3.10', '2.22'] ['2.01', '2.01', '2.22', '2.34', '2.34', '2.45', '3.01', '3.10', '3.21']
3.其他替換冒號跟短橫線的方法:
james=['2-34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22']print(type(james)) tihuan=str(james) tihuan1=tihuan.replace("-",".") tihuan2=tihuan1.replace(":",".")print tihuan2print(type(tihuan2))
列表推導
創(chuàng)建一個新列表來存放轉(zhuǎn)換后的數(shù)據(jù)
迭代處理原列表中的各個數(shù)據(jù)項
每次迭代都要完成轉(zhuǎn)換
將轉(zhuǎn)換后的數(shù)據(jù)追加到新列表
#將分鐘轉(zhuǎn)換成秒In [60]: mins=[1,2,3] In [61]: secs=[m*60 for m in mins] In [62]: secs Out[62]: [60, 120, 180]#將name的小寫變成大寫In [63]: name=["my","name","is","huahua"] In [66]: upper=[s.upper() for s in name] In [67]: upper Out[67]: ['MY', 'NAME', 'IS', 'HUAHUA']#將data中的字符串變成floatIn [68]: data=['2.01','2.22','9.66'] In [69]: data1=[float(q) for q in data] In [70]: data1 Out[70]: [2.01, 2.22, 9.66]
4. 簡化上述序號為2的代碼:
In [71]: james Out[71]: ['2-34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22'] In [72]: def sanitize(time_string): ...: if '-' in time_string: ...: splitter="-" ...: elif ":" in time_string: ...: splitter=":" ...: else: ...: return time_string ...: (mins1,secs1)=time_string.split(splitter) ...: return(mins1+"."+secs1) ...: In [73]: print(sorted([sanitize(i) for i in james])) #列表推倒['2.01', '2.01', '2.22', '2.34', '2.34', '2.45', '3.01', '3.10', '3.21']
列表分片
5.迭代刪除重復項,打印出最快的3個時間
思路:
需要新建一個空列表
填入james中找到的唯一的數(shù)據(jù)項(使用not in)
In [76]: james#james元數(shù)據(jù)Out[76]: ['2-34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22']#替換數(shù)據(jù)格式的函數(shù)In [77]: def sanitize(time_string): ...: if '-' in time_string: ...: splitter="-" ...: elif ":" in time_string: ...: splitter=":" ...: else: ...: return time_string ...: (mins1,secs1)=time_string.split(splitter) ...: return(mins1+"."+secs1) ...: #打印出轉(zhuǎn)換格式后的james并將他排序In [78]: james1=(sorted([sanitize(i)for i in james]))#排序后的數(shù)據(jù)In [79]: james1 Out[79]: ['2.01', '2.01', '2.22', '2.34', '2.34', '2.45', '3.01', '3.10', '3.21']#空列表In [80]: unique_james=[]#循環(huán)james1列表,判斷該元素是否在unique_james中存在,若存在,不添加,若不存在,添加In [81]: for s in james1: ...: if s not in unique_james: ...: unique_james.append(s) ...: print(unique_james[0:3]) #打印出最快的3個成績 ...: ['2.01', '2.22', '2.34']
使用集合刪除重復項
注意:集合是不允許有重復元素的
In [82]: s={1,2,3,4,5,5,5,5,5,5,} In [83]: s Out[83]: {1, 2, 3, 4, 5}
6.使用set和列表分片修改上述代碼(打印出最快的3個時間)
In [86]: james Out[86]: ['2-34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22'] In [87]: def sanitize(time_string): ...: if '-' in time_string: ...: splitter="-" ...: elif ":" in time_string: ...: splitter=":" ...: else: ...: return time_string ...: (mins1,secs1)=time_string.split(splitter) ...: return(mins1+"."+secs1) ...: #1.將轉(zhuǎn)換后的列表變成集合(set)#2.在將集合排序In [88]: james1=(sorted(set([sanitize(i)for i in james]))) In [89]: james1 Out[89]: ['2.01', '2.22', '2.34', '2.45', '3.01', '3.10', '3.21']#取最快的3個時間In [90]: james1=(sorted(set([sanitize(i)for i in james]))[0:3]) In [91]: james1 Out[91]: ['2.01', '2.22', '2.34']
知識點總結(jié):
sort()
原地排序(升序)
a.sort()
降序(sort(reverse=True))
sorted()
復制排序(升序)
data1=sorted(data)
降序(sorted(reverse=True))
列表推導
[表達式 for 變量 in 列表] 或者 [表達式 for 變量 in 列表 if 條件]
[m*60 for m in f]
列表分片
在分片規(guī)則里list、tuple、str(字符串)都可以稱為序列,都可以按規(guī)則進行切片操作
注意切片的下標0代表順序的第一個元素,-1代表倒序的第一個元素;且切片不包括右邊界,例如[0:3]代表元素0、1、2不包括3。
james[0:3]
set
set是無序的
不存在重復元素(可以使用set來去重)
=f.readline().strip().split( = = =(mins++yssj=get_filecontent((sorted(set([sanitize(i) i yssj]))[0:3
http://www.cnblogs.com/8013-cmf/p/7058804.html