跳到主要內容

Python 基礎資料結構介紹與常見BIF示範

參考頁面:[Python]如何在Python排序(Python Sorting)

Python保存資料使用的是類似陣列的清單結構
撰寫時型別由Python編譯器處理,不須再宣告型別
List能混合存入各類型的資料,如字串和數字混合放置,是最常被用到的資料結構
另外List中也能包含其他的list,就像多重陣列一樣
Tuple 資料結構類似 List,差別在於 List 內的資料是可變動的
Tuple 內指標指向的對象則不可變更

除了  List 和 Tuple 外
Python 另外還有 Dictionary 跟 Set 也是常用到的資料結構

Python的多行註解形式是 """註解""" ,單行註解則用#
在編譯器中執行以下程式碼

initList = []         #建立空的List,也可以用BIF方式建立 initList = list()
lists = ["new", "show", "Eclipse"]
demo = ["aa", ["bb", "cc"]]

print(initList)
print(lists[1])       #物件在 List 中的位置index從0開始算,lists[1]表示 list 裡的第2個物件
print(len(lists))     #這裡用上了len() BIF回傳List長度
print(demo[1])      

"""
output:

[]
show
3
['bb', 'cc']
"""

Tuple 資料結構的建立方式則是圓括號 (),如: initTuple = (1, "test")
也可以用 tuple() 來建立
稍微注意一點的是若要建立裡面只有單一物件的 Tuple 結構
使用 a = (1,) 這樣的形式可以避免 (1) 會被判定為數字的情形

Python稱呼它的內建方法為BIF(built-In Function)
List 和 Tuple 能使用的相差不多,除了會影響指向的資料的BIF例外

set() BIF可以建立set資料結構,這種資料結構的特色是不會有重複的資料
如果試著要加入已經有在set中的資料,Python會忽略這個項目
tlist = [1, 2 ,3, 3 ,2]
tlist = set(tlist)
print(tlist)

"""output:
{1, 2, 3}
"""

Python中還有一種資料型別是Dictionary,實作方式以Java舉例就是 Map
scores = {}              #建立空的Dictionary
scores[3.3] = 'Tifa'   #透過Key/Value的描述將資料動態的新增進Dictionary裡
scores[4.0] = 'Johan'
scores[2.7] = 'Milton'

要取得資料就要用 key 當索引值,ex.print(scores[2.7])
for score, name in scores.items():        #items()回傳鍵值對
    print(name + ' scores ' + str(score))

"""
另一種寫法是
for each_score in scores.keys():
    print(scores[each_score] + " scores " + each_score)
"""

Dictionary型別沒有 sort()、append()等List有的方法
所以如果要針對其中的數據作排序要用sorted() BIF
for each_score in sorted(scores.keys(), reverse = True):    #使用sorted() BIF
    print(scores[each_score] + " scores " + each_score)


以下列舉常用到的BIF,注意非List資料結構可能會不適用少部分BIF

append()
將一筆資料附加到尾端        
使用方式:lists.append("lol")

pop()
從最尾端取出一筆資料     
使用方式:lists.pop()           #output:lol

extend()
加入一群資料  
使用方式:lists.extend(["hi", "hello"])

remove()
移除特定的資料項
使用方式:lists.remove("hi")

insert()
插入一筆資料 
使用方式:lists.insert(0, "head")     #第一個參數為插入的位置的index

list()
用於新建空清單的函式

len()
取得List長度    
使用方式:len(List)

iter()
回傳一個Iterator,作用是能將資料一筆一筆地做處理
使用方式見next()的範例程式碼

next() 
對於一個有Iterator的資料結構,指定它傳回下一筆資料
使用方式:
lists = ["new", "show", "Eclipse"]
listIterator = iter(lists)
print(next(listIterator))
print(next(listIterator))

"""output:
new
show
"""

range()
回傳一個Iterator,並依照給定的範圍產生數字   
使用方式:
for num in range(3):
    print(num)

"""output
0
1
2
"""

sort()
將List裡的值由低到高排序後回傳

sorted()
sorted 回傳排序後的副本,原本的物件則會繼續保持未排序的狀態
重點之一 sort() 只能處理 List;sorted()則可以對任何 iterable 物件做排序
兩個排序BIF預設都由小到大排列,需要descending則可以傳入 reverse=True 引數
另外可以設定 key 引數作排序的根據
使用示範:
#class之後會再解釋
class Student:
        def __init__(self, name, grade, age):  #建構式
                self.name = name
                self.grade = grade
                self.age = age
        def __repr__(self):    #覆寫print()輸出的內容
                return repr((self.name, self.grade, self.age))

student_objects = [
        Student('john', 'A', 15),
        Student('jane', 'B', 12),
        Student('dave', 'B', 10),
]

print(sorted(student_objects, key = lambda obj : obj.age) )

""" or code below
print(sorted(student_objects, key=attrgetter('grade', 'age')))
"""

示範中有兩種做法
第一種是用 lambda 關鍵字讓 .age 屬性為排序根據
第二種則是用 operator module 指定先以成績,後再以年齡排序

reverse()
逆轉陣列的順序     

count()
計算某個項目在資料結構裡面重複的次數
使用方式:
lists = ["new", "show", "Eclipse"]
print(lists.count("new"))     #output:1

a = "test - this is a test"     #a為字串型別
print(a.count("test"))         #output:2

pow()
這個BIF的使用型態是 pow(x, y[, z]),第3個參數是選用的
僅輸入前兩個參數會回傳 x 的 y 次方值,加第3個參數則回傳 % z的值
使用方式:
print(pow(5, 3))           #output:125
print(pow(5, 3, 3))       #output:2

sum()
會將引數中的List裡的數字作加總  
使用方式:sum(list)

randint()
回傳介於兩引數之間的任意整數
使用方式:randint(1, 10)

int()
將一個字串或數字轉換為整數

float()
將一個字串或數字轉換為浮點數

str() 
將數字轉換成字串

isdigit()
判斷某個字串物件的所有字元是否為數字
使用方式:print(lists[0].isdigit())   #output:false

id()
傳回一個資料物件在Python中被給定的獨特編號

input()
取得並回傳使用者輸入(似乎要在IDLE中才有效果) 
使用方式:
>>> a = input()
99
>>> print(a)
99

enumerate()
補足Iterator的index值
使用方式:
for i, n in enumerate([1, 3, 5]):
  print(i, n)

"""  output
0 1
   1 3
   2 5
"""

zip()
整合多個Lists
使用方法:
    names = ["John", "Marry", "Tom"]
    sexes = ["Male", "Female", "Male"]
    for name, sex in zip(names, sexes):
        print(name, sex)

"""  output
John Male
   Marry Female
   Tom Male
"""

留言

張貼留言