天天看點

第三章 Python豐富的資料類型

什麼是資料類型?

前兩章裡面包含的字元串、布爾類型、整數、浮點數都是資料類型。資料類型在一個程式設計語言中必不可少,也是使用最多的。

而且資料類型的資料都是存放在記憶體中的,我們一般操作都是在對記憶體裡對象操作。

什麼是數組?

   數組也是一種資料類型,為了友善處理資料,把一些同類資料放到一起就是數組,是一組資料的集合,數組内的資料稱為元素,每個元素都有一個下标(索引),從0開始。

在python中,内建資料結構有清單(list)、元組(tuple)、字典(dict)、集合(set)。

<b>3.1 清單[list]</b>

   <b>3.1.1 定義清單</b>

     &gt;&gt;&gt; lst = ['a','b','c',1,2,3]

   用中括号括起來,元素以逗号分隔,字元串用單引号引起來,整數不用。

第三章 Python豐富的資料類型

  <b> 3.1.2 基本操作</b>

# 追加一個元素

&gt;&gt;&gt; lst.append(4)

&gt;&gt;&gt; lst

['a', 'b', 'c', 1, 2, 3, 4]

# 統計清單中a字元出現的次數

&gt;&gt;&gt; lst.count('a')

1

# 将一個清單作為元素添加到lst清單中

&gt;&gt;&gt; a = [5,6]

&gt;&gt;&gt; lst.extend(a)

['a', 'b', 'c', 1, 2, 3, 4, 5, 6]

# 查找元素3的索引位置

&gt;&gt;&gt; lst.index(1)

3

# 在第3個索引位置插入一個元素

&gt;&gt;&gt; lst.insert(3, 0)

['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6]

# 删除最後一個元素和第3個下标元素

&gt;&gt;&gt; lst.pop()  

6

&gt;&gt;&gt; lst.pop(3)

['a', 'b', 'c', 1, 2, 3, 4, 5]

# 删除元素是5,如果沒有會傳回錯誤

&gt;&gt;&gt; lst.remove("5")

# 倒序排列元素

&gt;&gt;&gt; lst.reverse()

[4, 3, 2, 1, 'c', 'b', 'a']

# 正向排序元素

&gt;&gt;&gt; lst.sort()

[1, 2, 3, 4, 'a', 'b', 'c']

# 清單連接配接

&gt;&gt;&gt; a = [1,2,3]

&gt;&gt;&gt; b = ['a','b','c']

&gt;&gt;&gt; a + b

[1, 2, 3, 'a', 'b', 'c']

<b>   3.1.3 學習新函數對清單排序</b>

# reversed()函數倒序排列

使用此函數會建立一個疊代器,周遊列印才能輸出:

&gt;&gt;&gt; lst = ['a', 'b', 'c', 1, 2, 3, 4, 5]

&gt;&gt;&gt; type(reversed(lst))

&lt;type 'listreverseiterator'&gt;

&gt;&gt;&gt; lst2 = []

&gt;&gt;&gt; for i in reversed(lst):

...   lst2.append(i)

...

&gt;&gt;&gt; lst2

[5, 4, 3, 2, 1, 'c', 'b', 'a']

# sorted()函數正向排列

&gt;&gt;&gt; for i in sorted(lst):

[1, 2, 3, 4, 5, 'a', 'b', 'c']

這裡在講解一個序列生成器range()函數,生成的是一個清單:

&gt;&gt;&gt; type(range(5))

&lt;type 'list'&gt;

&gt;&gt;&gt; for i in range(1,5):

...   print i

2

4

當然也可以用上面的排序函數來排序這個生成的序列了:

&gt;&gt;&gt; for i in reversed(range(1,10,3)):

7

range()函數用法:range(start,end,step)

<b>   </b>說明:是不是和清單内置方法結果一樣!差別是内置函數不改動原有序列。

<b>   3.1.4 切片</b>

# 傳回第一個元素

&gt;&gt;&gt; lst[0]

# 傳回倒數第一個元素

&gt;&gt;&gt; lst[-1]

'c'

# 取出倒數第一個元素

&gt;&gt;&gt; lst[0:-1]

[1, 2, 3, 4, 'a', 'b']

# 傳回第一個至第四個元素

&gt;&gt;&gt; lst[0:4]

[1, 2, 3, 4]

<b>   3.1.5 清空清單</b>

方法1:

&gt;&gt;&gt; lst = [1, 2, 3, 4, 'a', 'b', 'c']

&gt;&gt;&gt; lst = []

[]

方法2:

&gt;&gt;&gt; del lst[:]

# 删除清單

&gt;&gt;&gt; del lst

traceback (most recent call last):

  file "&lt;stdin&gt;", line 1, in &lt;module&gt;

nameerror: name 'lst' is not defined

<b>   3.1.6 del語句</b>

   del語句也可以删除一個下标範圍的元素

&gt;&gt;&gt; del lst[0:4]

['a', 'b', 'c']

  <b> 3.1.7 清單推導式</b>

   利用其它清單推導出新的清單。

# 通過疊代對象方法

&gt;&gt;&gt; for i in range(5):

...   lst.append(i)

[0, 1, 2, 3, 4]

&gt;&gt;&gt; lst = [i for i in range(5)]

說明:方法1和方法2,實作方式是一樣的,隻是方法2用簡潔的寫法。for循環在下一章會講。

# 通過已有的清單生成新清單

&gt;&gt;&gt; lst2 = [i for i in lst if i &gt; 2]

[3, 4]

<b>   3.1.8 周遊清單</b>

<b>   </b>如果既要周遊索引又要周遊元素,可以這樣寫。

&gt;&gt;&gt; lst = ['a','b','c',1,2,3]

&gt;&gt;&gt; for i in range(len(lst)):

...   print i,lst[i]         

0 a

1 b

2 c

3 1

4 2

5 3

&gt;&gt;&gt; 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>

      &gt;&gt;&gt; s = set()

&gt;&gt;&gt; s

set([])

   使用set()函數建立集合。   

<b>3.3.2 基本操作</b>

# 添加元素

&gt;&gt;&gt; s.add('a')

set(['a'])

&gt;&gt;&gt; s.add('b')

set(['a', 'b'])

&gt;&gt;&gt; s.add('c')

set(['a', 'c', 'b'])

說明:可以看到,添加的元素是無序的,并且不重複的。

# update方法事把傳入的元素拆分為個體傳入到集合中。與直接set('1234')效果一樣。

&gt;&gt;&gt; s.update('1234')

set(['a', 'c', 'b', '1', '3', '2', '4'])

# 删除元素

&gt;&gt;&gt; s.remove('4')   

set(['a', 'c', 'b', '1', '3', '2'])

# 删除元素,沒有也不會報錯,而remove會報錯

&gt;&gt;&gt; s.discard('4')   

# 删除第一個元素

&gt;&gt;&gt; s.pop()

'a'

set(['c', 'b', '1', '3', '2'])

# 清空元素

&gt;&gt;&gt; s.clear()

# 清單轉集合,同時去重

&gt;&gt;&gt; lst = ['a','b','c',1,2,3,1,2,3]

&gt;&gt;&gt; s = set(lst)

set(['a', 1, 'c', 'b', 2, 3])

<b>3.3.3 關系測試</b>

符号

描述

-

差集

&amp;

交集

|

合集、并集

!=

不等于

==

等于

in

是成員為真

not in

不是成員為真

 示例:

# 傳回差集

&gt;&gt;&gt; a - b

set(['1', '3', '2'])

&gt;&gt;&gt; b - a

set(['9', '8', '7'])

# 傳回交集

&gt;&gt;&gt; a &amp; b

set(['5', '4', '6'])

# 傳回合集

&gt;&gt;&gt; a | b

set(['1', '3', '2', '5', '4', '7', '6', '9', '8'])

# 不等于

&gt;&gt;&gt; a != b

true

# 等于

&gt;&gt;&gt; a == b

false

# 存在為真

&gt;&gt;&gt; '1' in a

# 不存在為真

&gt;&gt;&gt; '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>

     &gt;&gt;&gt; d = {'a':1, 'b':2, 'c':3}

<b>   </b>用大括号括起來,一個鍵對應一個值,冒号分隔,多個鍵值逗号分隔。

   <b>3.4.2 基本操作</b>

# 傳回所有鍵值

&gt;&gt;&gt; d.items()

[('a', 1), ('c', 3), ('b', 2)]

# 傳回所有鍵

&gt;&gt;&gt; d.keys()

['a', 'c', 'b']

# 檢視所有值

&gt;&gt;&gt; d.values()

[1, 3, 2]

# 添加鍵值

&gt;&gt;&gt; d['e'] = 4

&gt;&gt;&gt; d

{'a': 1, 'c': 3, 'b': 2, 'e': 4}

# 擷取單個鍵的值,如果這個鍵不存在就會抛出keyerror錯誤

&gt;&gt;&gt; d['a']

&gt;&gt;&gt; 1

# 擷取單個鍵的值,如果有這個鍵就傳回對應的值,否則傳回自定義的值no

&gt;&gt;&gt; d.get('a','no')

&gt;&gt;&gt; d.get('f','no')

no

# 删除第一個鍵值

&gt;&gt;&gt; d.popitem()

('a', 1)

{'c': 3, 'b': 2, 'e': 4}

# 删除指定鍵

&gt;&gt;&gt; d.pop('b')

{'c': 3, 'e': 4}

# 添加其他字典鍵值到本字典

&gt;&gt;&gt; d2 = {'a':1}

&gt;&gt;&gt; d.update(d2) 

{'a': 1, 'c': 3, 'e': 4}

# 拷貝為一個新字典

&gt;&gt;&gt; dd = d.copy()

&gt;&gt;&gt; dd

# 判斷鍵是否在字典

&gt;&gt;&gt; d.has_key('a')

&gt;&gt;&gt; d.has_key('b')

<b>    3.4.3 可疊代對象</b>

   字典提供了幾個擷取鍵值的疊代器,友善我們在寫程式時處理,就是下面以iter開頭的方法。

d.iteritems() <b> </b># 擷取所有鍵值,很常用

d.iterkeys()   # 擷取所有鍵

d.itervalues() # 擷取所有值

# 周遊iteritems()疊代器

&gt;&gt;&gt; for i in d.iteritems():

('c', 3)

('b', 2)

說明:以元組的形式列印出了鍵值

如果我們隻想得到鍵或者值呢,就可以通過元組下标來分别擷取鍵值:

&gt;&gt;&gt; for i in d.iteritems():   

...   print "%s:%s" %(i[0],i[1])

a:1

c:3

b:2

有比上面更好的方法實作:

&gt;&gt;&gt; for k, v in d.iteritems():

...   print "%s: %s" %(k, v)   

a: 1

c: 3

b: 2

這樣就可以很方面處理鍵值了!

# 周遊其他兩個疊代器也是同樣的方法

&gt;&gt;&gt; for i in d.iterkeys():

a

c

b

&gt;&gt;&gt; for i in d.itervalues():

   說明:上面用到了for循環來周遊疊代器,for循環的用法在下一章會詳細講解。

<b>   3.4.4 一個鍵多個值</b>

   一個鍵對應一個值,有些情況無法滿足需求,字典允許一個鍵多個值,也就是嵌入其他數組,包括字典本身。

      # 嵌入清單

&gt;&gt;&gt; d = {'a':[1,2,3], 'b':2, 'c':3}

&gt;&gt;&gt; d['a']    

[1, 2, 3]  

&gt;&gt;&gt; d['a'][0]  # 擷取值

&gt;&gt;&gt; d['a'].append(4)  # 追加元素

{'a': [1, 2, 3, 4], 'c': 3, 'b': 2}

# 嵌入元組

&gt;&gt;&gt; d = {'a':(1,2,3), 'b':2, 'c':3}   

&gt;&gt;&gt; d['a'][1]

# 嵌入字典

&gt;&gt;&gt; d = {'a':{'d':4,'e':5}, 'b':2, 'c':3}   

{'e': 5, 'd': 4}

&gt;&gt;&gt; d['a']['d']    # 擷取值

&gt;&gt;&gt; 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("名稱", [名字清單])

&gt;&gt;&gt; from collections import namedtuple

&gt;&gt;&gt; nt = namedtuple('point', ['a', 'b', 'c'])

&gt;&gt;&gt; p = nt(1,2,3)

&gt;&gt;&gt; p.a

&gt;&gt;&gt; p.b

&gt;&gt;&gt; p.c

   namedtuple函數規定了tuple元素的個數,并定義的名字個數與其對應。

<b>   3.5.2 deque</b>

   當list資料量大時,插入和删除元素會很慢,deque的作用就是為了快速實作插入和删除元素的雙向清單。

&gt;&gt;&gt; from collections import deque

&gt;&gt;&gt; q = deque(['a', 'b', 'c'])

&gt;&gt;&gt; q.append('d')

&gt;&gt;&gt; q

deque(['a', 'b', 'c', 'd'])

&gt;&gt;&gt; q.appendleft(0)

deque([0, 'a', 'b', 'c', 'd'])

&gt;&gt;&gt; q.pop()

'd'

&gt;&gt;&gt; q.popleft()

   實作了插入和删除頭部和尾部元素。比較适合做隊列。

  <b> 3.5.3 counter</b>

   顧名思義,計數器,用來計數。

   例如,統計字元出現的個數:

&gt;&gt;&gt; from collections import counter

&gt;&gt;&gt; c = counter()

&gt;&gt;&gt; for i in "hello world!":

...   c[i] += 1             

&gt;&gt;&gt; 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函數功能就是生成有序的字典。

   例如,根據前後插入順序排列:

&gt;&gt;&gt; d = {'a':1, 'b':2, 'c':3}

&gt;&gt;&gt; d   # 預設dict是無序的

{'a': 1, 'c': 3, 'b': 2}

&gt;&gt;&gt; from collections import ordereddict

&gt;&gt;&gt; od = ordereddict()

&gt;&gt;&gt; od['a'] = 1

&gt;&gt;&gt; od['b'] = 2

&gt;&gt;&gt; od['c'] = 3

&gt;&gt;&gt; od

ordereddict([('a', 1), ('b', 2), ('c', 3)])

# 轉為字典

&gt;&gt;&gt; import json 

&gt;&gt;&gt; json.dumps(od)

'{"a": 1, "b": 2, "c": 3}'

    ordereddict輸出的結果是清單,元組為元素,如果想傳回字典格式,可以通過json子產品進行轉化。

<b>3.6 資料類型轉換</b>

<b>   3.6.1 常見資料類型轉換</b>

# 轉整數

&gt;&gt;&gt; i = '1'

&gt;&gt;&gt; type(i)

&lt;type 'str'&gt;

&gt;&gt;&gt; type(int(i))

&lt;type 'int'&gt;

# 轉浮點數

&gt;&gt;&gt; f = 1

&gt;&gt;&gt; type(f)

&gt;&gt;&gt; type(float(f))

&lt;type 'float'&gt;

# 轉字元串

&gt;&gt;&gt; i = 1

&gt;&gt;&gt; type(int(1))

# 字元串轉清單

方式1:

&gt;&gt;&gt; s = 'abc'

&gt;&gt;&gt; lst = list(s)

方式2:

&gt;&gt;&gt; s = 'abc 123'

&gt;&gt;&gt; s.split()   

['abc', '123']

# 清單轉字元串

&gt;&gt;&gt; s = ""

&gt;&gt;&gt; s = ''.join(lst)

'abc'

# 元組轉清單

&gt;&gt;&gt; t = tuple(lst)

&gt;&gt;&gt; t

('a', 'b', 'c')

# 清單轉元組

&gt;&gt;&gt; lst = list(t)

# 字典格式字元串轉字典

&gt;&gt;&gt; s = '{"a": 1, "b": 2, "c": 3}'

&gt;&gt;&gt; type(s)

&gt;&gt;&gt; d = eval(s)

&gt;&gt;&gt; type(d)

&lt;type 'dict'&gt;

&gt;&gt;&gt; import json

&gt;&gt;&gt; json.loads(s)

{u'a': 1, u'c': 3, u'b': 2}

&gt;&gt;&gt; d = json.loads(s)

<b>   3.6.2 學習兩個新内建函數</b>

       1) join()

         join()函數是字元串操作函數,用于字元串連接配接。

# 字元串時,每個字元作為單個體

&gt;&gt;&gt; s = "ttt"

&gt;&gt;&gt; ".".join(s)

't.t.t'

# 以逗号連接配接元組元素,生成字元串,與上面的清單用法一樣。

&gt;&gt;&gt; t = ('a', 'b', 'c')

&gt;&gt;&gt; s = ",".join(t)

'a,b,c'

           # 字典

&gt;&gt;&gt; ",".join(d)

'a,c,b'

<b>   </b>    2) eval()

         eval()函數将字元串當成python表達式來處理。

&gt;&gt;&gt; s = "abc"

&gt;&gt;&gt; eval('s')

&gt;&gt;&gt; a = 1

&gt;&gt;&gt; eval('a + 1')

&gt;&gt;&gt; eval('1 + 1')