什麼是資料類型?
前兩章裡面包含的字元串、布爾類型、整數、浮點數都是資料類型。資料類型在一個程式設計語言中必不可少,也是使用最多的。
而且資料類型的資料都是存放在記憶體中的,我們一般操作都是在對記憶體裡對象操作。
什麼是數組?
數組也是一種資料類型,為了友善處理資料,把一些同類資料放到一起就是數組,是一組資料的集合,數組内的資料稱為元素,每個元素都有一個下标(索引),從0開始。
在python中,内建資料結構有清單(list)、元組(tuple)、字典(dict)、集合(set)。
<b>3.1 清單[list]</b>
<b>3.1.1 定義清單</b>
>>> lst = ['a','b','c',1,2,3]
用中括号括起來,元素以逗号分隔,字元串用單引号引起來,整數不用。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLmBDZiNTMyYDZjJGOxUTZ2cjZzQWY1gjZhBzNmVTY3QjZ2cDMwEGO18CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
<b> 3.1.2 基本操作</b>
# 追加一個元素
>>> lst.append(4)
>>> lst
['a', 'b', 'c', 1, 2, 3, 4]
# 統計清單中a字元出現的次數
>>> lst.count('a')
1
# 将一個清單作為元素添加到lst清單中
>>> a = [5,6]
>>> lst.extend(a)
['a', 'b', 'c', 1, 2, 3, 4, 5, 6]
# 查找元素3的索引位置
>>> lst.index(1)
3
# 在第3個索引位置插入一個元素
>>> lst.insert(3, 0)
['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6]
# 删除最後一個元素和第3個下标元素
>>> lst.pop()
6
>>> lst.pop(3)
['a', 'b', 'c', 1, 2, 3, 4, 5]
# 删除元素是5,如果沒有會傳回錯誤
>>> lst.remove("5")
# 倒序排列元素
>>> lst.reverse()
[4, 3, 2, 1, 'c', 'b', 'a']
# 正向排序元素
>>> lst.sort()
[1, 2, 3, 4, 'a', 'b', 'c']
# 清單連接配接
>>> a = [1,2,3]
>>> b = ['a','b','c']
>>> a + b
[1, 2, 3, 'a', 'b', 'c']
<b> 3.1.3 學習新函數對清單排序</b>
# reversed()函數倒序排列
使用此函數會建立一個疊代器,周遊列印才能輸出:
>>> lst = ['a', 'b', 'c', 1, 2, 3, 4, 5]
>>> type(reversed(lst))
<type 'listreverseiterator'>
>>> lst2 = []
>>> for i in reversed(lst):
... lst2.append(i)
...
>>> lst2
[5, 4, 3, 2, 1, 'c', 'b', 'a']
# sorted()函數正向排列
>>> for i in sorted(lst):
[1, 2, 3, 4, 5, 'a', 'b', 'c']
這裡在講解一個序列生成器range()函數,生成的是一個清單:
>>> type(range(5))
<type 'list'>
>>> for i in range(1,5):
... print i
2
4
當然也可以用上面的排序函數來排序這個生成的序列了:
>>> for i in reversed(range(1,10,3)):
7
range()函數用法:range(start,end,step)
<b> </b>說明:是不是和清單内置方法結果一樣!差別是内置函數不改動原有序列。
<b> 3.1.4 切片</b>
# 傳回第一個元素
>>> lst[0]
# 傳回倒數第一個元素
>>> lst[-1]
'c'
# 取出倒數第一個元素
>>> lst[0:-1]
[1, 2, 3, 4, 'a', 'b']
# 傳回第一個至第四個元素
>>> lst[0:4]
[1, 2, 3, 4]
<b> 3.1.5 清空清單</b>
方法1:
>>> lst = [1, 2, 3, 4, 'a', 'b', 'c']
>>> lst = []
[]
方法2:
>>> del lst[:]
# 删除清單
>>> del lst
traceback (most recent call last):
file "<stdin>", line 1, in <module>
nameerror: name 'lst' is not defined
<b> 3.1.6 del語句</b>
del語句也可以删除一個下标範圍的元素
>>> del lst[0:4]
['a', 'b', 'c']
<b> 3.1.7 清單推導式</b>
利用其它清單推導出新的清單。
# 通過疊代對象方法
>>> for i in range(5):
... lst.append(i)
[0, 1, 2, 3, 4]
>>> lst = [i for i in range(5)]
說明:方法1和方法2,實作方式是一樣的,隻是方法2用簡潔的寫法。for循環在下一章會講。
# 通過已有的清單生成新清單
>>> lst2 = [i for i in lst if i > 2]
[3, 4]
<b> 3.1.8 周遊清單</b>
<b> </b>如果既要周遊索引又要周遊元素,可以這樣寫。
>>> lst = ['a','b','c',1,2,3]
>>> for i in range(len(lst)):
... print i,lst[i]
0 a
1 b
2 c
3 1
4 2
5 3
>>> for index, value in enumerate(lst):
... print index,value
<b> </b>又學了一個新函數enumrate(),可周遊清單、字元串的下标和元素。
<b>3.2 元組(tuple)</b>
<b> 元組與清單類型,不同之處在于元素的元素不可修改。</b>
<b> 2.1 定義元組</b>
t = ('a','b','c',1,2,3)
用小括号括起來,元素以逗号分隔,字元串用單引号引起來,整數不用。 <b> </b>
<b> 2.2 基本操作</b>
<b> </b>count()和index()方法和切片使用方法與清單使用一樣,這裡不再講解。
<b>3.3 集合(set)</b>
集合是一個無序不重複元素的序列,主要功能用于删除重複元素和關系測試。
集合對象還支援聯合(union),交集(intersection),差集(difference)和對稱差集(sysmmetric difference)數學運算。
需要注意的是,集合對象不支援索引,是以不可以被切片。
<b> 3.3.1 定義集合</b>
>>> s = set()
>>> s
set([])
使用set()函數建立集合。
<b>3.3.2 基本操作</b>
# 添加元素
>>> s.add('a')
set(['a'])
>>> s.add('b')
set(['a', 'b'])
>>> s.add('c')
set(['a', 'c', 'b'])
說明:可以看到,添加的元素是無序的,并且不重複的。
# update方法事把傳入的元素拆分為個體傳入到集合中。與直接set('1234')效果一樣。
>>> s.update('1234')
set(['a', 'c', 'b', '1', '3', '2', '4'])
# 删除元素
>>> s.remove('4')
set(['a', 'c', 'b', '1', '3', '2'])
# 删除元素,沒有也不會報錯,而remove會報錯
>>> s.discard('4')
# 删除第一個元素
>>> s.pop()
'a'
set(['c', 'b', '1', '3', '2'])
# 清空元素
>>> s.clear()
# 清單轉集合,同時去重
>>> lst = ['a','b','c',1,2,3,1,2,3]
>>> s = set(lst)
set(['a', 1, 'c', 'b', 2, 3])
<b>3.3.3 關系測試</b>
符号
描述
-
差集
&
交集
|
合集、并集
!=
不等于
==
等于
in
是成員為真
not in
不是成員為真
示例:
# 傳回差集
>>> a - b
set(['1', '3', '2'])
>>> b - a
set(['9', '8', '7'])
# 傳回交集
>>> a & b
set(['5', '4', '6'])
# 傳回合集
>>> a | b
set(['1', '3', '2', '5', '4', '7', '6', '9', '8'])
# 不等于
>>> a != b
true
# 等于
>>> a == b
false
# 存在為真
>>> '1' in a
# 不存在為真
>>> '7' not in a
<b>部落格位址:http://lizhenliang.blog.51cto.com and https://yq.aliyun.com/u/lizhenliang</b>
qq群:323779636(shell/python運維開發群)
<b></b>
<b>3.4 字典{dict}</b>
序列是以連續的整數位索引,與字典不同的是,字典以關鍵字為索引,關鍵字可以是任意不可變對象(不可修改),通常是字元串或數值。
字典是一個無序鍵:值(key:value)集合,在一字典中鍵必須是互不相同的,
<b> 3.4.1 定義字典</b>
>>> d = {'a':1, 'b':2, 'c':3}
<b> </b>用大括号括起來,一個鍵對應一個值,冒号分隔,多個鍵值逗号分隔。
<b>3.4.2 基本操作</b>
# 傳回所有鍵值
>>> d.items()
[('a', 1), ('c', 3), ('b', 2)]
# 傳回所有鍵
>>> d.keys()
['a', 'c', 'b']
# 檢視所有值
>>> d.values()
[1, 3, 2]
# 添加鍵值
>>> d['e'] = 4
>>> d
{'a': 1, 'c': 3, 'b': 2, 'e': 4}
# 擷取單個鍵的值,如果這個鍵不存在就會抛出keyerror錯誤
>>> d['a']
>>> 1
# 擷取單個鍵的值,如果有這個鍵就傳回對應的值,否則傳回自定義的值no
>>> d.get('a','no')
>>> d.get('f','no')
no
# 删除第一個鍵值
>>> d.popitem()
('a', 1)
{'c': 3, 'b': 2, 'e': 4}
# 删除指定鍵
>>> d.pop('b')
{'c': 3, 'e': 4}
# 添加其他字典鍵值到本字典
>>> d2 = {'a':1}
>>> d.update(d2)
{'a': 1, 'c': 3, 'e': 4}
# 拷貝為一個新字典
>>> dd = d.copy()
>>> dd
# 判斷鍵是否在字典
>>> d.has_key('a')
>>> d.has_key('b')
<b> 3.4.3 可疊代對象</b>
字典提供了幾個擷取鍵值的疊代器,友善我們在寫程式時處理,就是下面以iter開頭的方法。
d.iteritems() <b> </b># 擷取所有鍵值,很常用
d.iterkeys() # 擷取所有鍵
d.itervalues() # 擷取所有值
# 周遊iteritems()疊代器
>>> for i in d.iteritems():
('c', 3)
('b', 2)
說明:以元組的形式列印出了鍵值
如果我們隻想得到鍵或者值呢,就可以通過元組下标來分别擷取鍵值:
>>> for i in d.iteritems():
... print "%s:%s" %(i[0],i[1])
a:1
c:3
b:2
有比上面更好的方法實作:
>>> for k, v in d.iteritems():
... print "%s: %s" %(k, v)
a: 1
c: 3
b: 2
這樣就可以很方面處理鍵值了!
# 周遊其他兩個疊代器也是同樣的方法
>>> for i in d.iterkeys():
a
c
b
>>> for i in d.itervalues():
說明:上面用到了for循環來周遊疊代器,for循環的用法在下一章會詳細講解。
<b> 3.4.4 一個鍵多個值</b>
一個鍵對應一個值,有些情況無法滿足需求,字典允許一個鍵多個值,也就是嵌入其他數組,包括字典本身。
# 嵌入清單
>>> d = {'a':[1,2,3], 'b':2, 'c':3}
>>> d['a']
[1, 2, 3]
>>> d['a'][0] # 擷取值
>>> d['a'].append(4) # 追加元素
{'a': [1, 2, 3, 4], 'c': 3, 'b': 2}
# 嵌入元組
>>> d = {'a':(1,2,3), 'b':2, 'c':3}
>>> d['a'][1]
# 嵌入字典
>>> d = {'a':{'d':4,'e':5}, 'b':2, 'c':3}
{'e': 5, 'd': 4}
>>> d['a']['d'] # 擷取值
>>> d['a']['e'] = 6 # 修改值
{'a': {'e': 6, 'd': 4}, 'c': 3, 'b': 2}
<b>3.5 額外的資料類型</b>
colloctions()函數在内置資料類型基礎上,又增加了幾個額外的功能,替代内建的字典、清單、集合、元組及其他資料類型。
<b> 3.5.1 namedtuple</b>
namedtuple函數功能是使用名字來通路元組元素。
文法:namedtuple("名稱", [名字清單])
>>> from collections import namedtuple
>>> nt = namedtuple('point', ['a', 'b', 'c'])
>>> p = nt(1,2,3)
>>> p.a
>>> p.b
>>> p.c
namedtuple函數規定了tuple元素的個數,并定義的名字個數與其對應。
<b> 3.5.2 deque</b>
當list資料量大時,插入和删除元素會很慢,deque的作用就是為了快速實作插入和删除元素的雙向清單。
>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('d')
>>> q
deque(['a', 'b', 'c', 'd'])
>>> q.appendleft(0)
deque([0, 'a', 'b', 'c', 'd'])
>>> q.pop()
'd'
>>> q.popleft()
實作了插入和删除頭部和尾部元素。比較适合做隊列。
<b> 3.5.3 counter</b>
顧名思義,計數器,用來計數。
例如,統計字元出現的個數:
>>> from collections import counter
>>> c = counter()
>>> for i in "hello world!":
... c[i] += 1
>>> c
counter({'l': 3, 'o': 2, '!': 1, ' ': 1, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})
結果是以字典的形式存儲,實際counter是dict的一個子類。
<b> 3.5.4 ordereddict</b>
内置dict是無序的,ordereddict函數功能就是生成有序的字典。
例如,根據前後插入順序排列:
>>> d = {'a':1, 'b':2, 'c':3}
>>> d # 預設dict是無序的
{'a': 1, 'c': 3, 'b': 2}
>>> from collections import ordereddict
>>> od = ordereddict()
>>> od['a'] = 1
>>> od['b'] = 2
>>> od['c'] = 3
>>> od
ordereddict([('a', 1), ('b', 2), ('c', 3)])
# 轉為字典
>>> import json
>>> json.dumps(od)
'{"a": 1, "b": 2, "c": 3}'
ordereddict輸出的結果是清單,元組為元素,如果想傳回字典格式,可以通過json子產品進行轉化。
<b>3.6 資料類型轉換</b>
<b> 3.6.1 常見資料類型轉換</b>
# 轉整數
>>> i = '1'
>>> type(i)
<type 'str'>
>>> type(int(i))
<type 'int'>
# 轉浮點數
>>> f = 1
>>> type(f)
>>> type(float(f))
<type 'float'>
# 轉字元串
>>> i = 1
>>> type(int(1))
# 字元串轉清單
方式1:
>>> s = 'abc'
>>> lst = list(s)
方式2:
>>> s = 'abc 123'
>>> s.split()
['abc', '123']
# 清單轉字元串
>>> s = ""
>>> s = ''.join(lst)
'abc'
# 元組轉清單
>>> t = tuple(lst)
>>> t
('a', 'b', 'c')
# 清單轉元組
>>> lst = list(t)
# 字典格式字元串轉字典
>>> s = '{"a": 1, "b": 2, "c": 3}'
>>> type(s)
>>> d = eval(s)
>>> type(d)
<type 'dict'>
>>> import json
>>> json.loads(s)
{u'a': 1, u'c': 3, u'b': 2}
>>> d = json.loads(s)
<b> 3.6.2 學習兩個新内建函數</b>
1) join()
join()函數是字元串操作函數,用于字元串連接配接。
# 字元串時,每個字元作為單個體
>>> s = "ttt"
>>> ".".join(s)
't.t.t'
# 以逗号連接配接元組元素,生成字元串,與上面的清單用法一樣。
>>> t = ('a', 'b', 'c')
>>> s = ",".join(t)
'a,b,c'
# 字典
>>> ",".join(d)
'a,c,b'
<b> </b> 2) eval()
eval()函數将字元串當成python表達式來處理。
>>> s = "abc"
>>> eval('s')
>>> a = 1
>>> eval('a + 1')
>>> eval('1 + 1')