一:編寫程序

現(xiàn)如今有4組秒表記錄的數(shù)據(jù),分別如下:

  1. james.txt:2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22

  2. julie.txt:2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21

  3. mikey.txt:2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38

  4. 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

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

julie.txt

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

mikey.txt

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

sarah.txt

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

二:排序的兩種方式


    • 原地排序:sort()方法  升序

    • 降序:sort(reverse=True)

    • 復制排序:sort()   BIF升序

    • 降序:sorted(reverse=True)

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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]

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

1.給julie排序

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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:該段代碼還需修改

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

從上段代碼結(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的正常排序):

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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']

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

3.其他替換冒號跟短橫線的方法:

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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))

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

列表推導

  1. 創(chuàng)建一個新列表來存放轉(zhuǎn)換后的數(shù)據(jù)

  2. 迭代處理原列表中的各個數(shù)據(jù)項

  3. 每次迭代都要完成轉(zhuǎn)換

  4. 將轉(zhuǎn)換后的數(shù)據(jù)追加到新列表

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

#將分鐘轉(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]

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

4. 簡化上述序號為2的代碼:

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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']

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

列表分片

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

5.迭代刪除重復項,打印出最快的3個時間

思路:

  • 需要新建一個空列表

  • 填入james中找到的唯一的數(shù)據(jù)項(使用not in)

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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']

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

 使用集合刪除重復項

注意:集合是不允許有重復元素的

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個時間)

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

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']

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

 知識點總結(jié):

 sort()

  1. 原地排序(升序)

  2. a.sort()

  3. 降序(sort(reverse=True))

sorted()

  1. 復制排序(升序)

  2. data1=sorted(data)

  3. 降序(sorted(reverse=True))

列表推導

  1. [表達式 for 變量 in 列表]    或者  [表達式 for 變量 in 列表 if 條件]

  2. [m*60 for m in f]

列表分片

  1. 在分片規(guī)則里list、tuple、str(字符串)都可以稱為序列,都可以按規(guī)則進行切片操作

  2. 注意切片的下標0代表順序的第一個元素,-1代表倒序的第一個元素;且切片不包括右邊界,例如[0:3]代表元素0、1、2不包括3。

  3. james[0:3]

set

  1. set是無序的

  2. 不存在重復元素(可以使用set來去重) 

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

=f.readline().strip().split(  =
      =
    =(mins++yssj=get_filecontent((sorted(set([sanitize(i) i  yssj]))[0:3

大數(shù)據(jù)培訓,云培訓,數(shù)據(jù)挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經(jīng)理培訓

http://www.cnblogs.com/8013-cmf/p/7058804.html