Python學習筆記 - 9.元組(Tuple)

元組(tuple)是不可變得

元組用圓括號括起來,雖然這不是必需的,但可幫我們在Python代碼中快速識別出哪些是元組。

    >>> t = ('a','b','c','d','e')

創建單個元素的元組,必須在末尾加一個逗號。

    >>> t1 = ('a',)
    >>> type(t1)
    <type 'tuple'>

否則,Python會將(’ a ‘)作爲一個字符串處理:

    >>> t2 = ('a')
    >>> type(t2)
    <type 'str'>

構造元組的另一種方法是,使用內置函數tuple。如果不帶參數,tuple函數會創建一個空元組:

    >>> t = tuple()
    >>> print t
    ()

如果參數是一個序列(字符串、列表或元組),tuple函數的調用結果是產生一個包含序列元素的元組:

    >>> t = tuple('lupins')
    >>> print t
    ('l','u','p','i','n','s')

大部分的列表操作符也適用於元組。方括號索引一個元素:

    >>> t = ('a','b','c','d','e')
    >>> print t[0]
    'a'

切片操作符選擇一組元素。

    >>> print t[1:3]
    ('b','c')

不能修改元組的元素,但可以用另一個元組替換當前元組:

    >>> t = ('A',) + t[1:]
    >>> print t
    ('A','b','c','d','e')

元組的比較

比較運算符適用於元組和其它序列,Python從每個序列的第一個元素開始比較。如果它們相等,繼續比較下一個元素,以此
類推,直到找到不同的元素。找到不同元素之後,隨後的元素就不再考慮了 (即便它們真得很大)。

    >>> (0,1,2) < (0,3,4)
    True
    >>> (0,1,2000000) < (0,3,4)
    True

元組中sort函數正是這個工作原理。它首先對第一個元素排序,如果第一個元素相同,則按第二個元素排序,以此類推。
這一特性使其擁有一種DSU模式:
修飾(Decorate):修飾:在序列的元素之前放置一個或多個排序鍵,
排序(Sort):使用Python內置函數sort進行排序,
去修飾(Undecorate):提取出序列中已排序的元素。
舉例來說,有一組單詞,對它們進行由長到短的排序:

    txt = 'but soft what light in yonder window breaks'
    words = txt.split()
    t = list()
    for word in words:
    #創建元組(單詞以及長度)
        t.append((len(word),word)) #在列表的末尾添加一個元素,只能是一個
    t.sort(reverse=True)
    res = list()
    for length, word in t:
        res.append(word)
    print res

第一個循環創建了一個元組,每個元組包括單詞及長度,單詞長度在前,單詞在後
sort函數進行兩兩比較,首先比較單詞長度,如果長度相等,則比較元組中的第二個元素。**關鍵字參數reverse=True指定sort
函數按照倒序排列**。
第二個循環遍歷了元組,創建了一個按照長度降序排列的單詞列表。這五個單詞按照反向字母順序排序,所以“what”出現
在“soft”之前。
程序輸出結果如下:

    ['yonder','window','breaks','light','what',
    'soft','but','in']

元組的賦值

在本例中,一個列表(序列)包含兩個元素。使用一行語句,將第一個元素和第二個元素分別賦予變量x和變量y

    >>> m = ['have','fun']
    >>> x,y = m
    >>> x
    'have'
    >>> y
    'fun'
    >>>

從文體上看,在賦值語句左側使用元組,我們忽略了括號,以下是有效的等價語法:

m = [‘have’,’fun’ ]
(x, y) = m
x
‘have’
y
‘fun’

元組賦值有一個特別巧妙的用途,可以在一條語句中交換兩個變量的值:

    >>> a,  b   =   b,  a

這條語句兩側都是元組,左側是變量元組,右側是表達式元組。右側的每個值分別賦予左側的每個變量。右側的所有表達式
在賦值之前進行檢查。
左側的變量個數與右側的值個數必須相同。

更普遍的情況是,右側可以是任何類型的序列,如字符串、列表或元組。例如,將郵件地址拆分成用戶名與域名的程序代碼
如下:

    >>> addr = '[email protected]'
    >>> uname,domain = addr.split('@')

字典與元組

元組擁有items方法,該方法返回元組列表,每個元組是一個鍵值對。

    >>> d = {'a':10,'b':1,'c':22}
    >>> t = d.items()
    >>> print t
    [('a',10),('c',22),('b',1)]

如果是字典的話,其中的數據項是沒有特定順序的。
由於元組列表本身是一個列表,元組之間可以進行比較,以及對元組列表進行排序。將字典轉化爲元組列表,這樣可以根據
鍵對字典進行排序,並輸出字典的內容。

    >>> d = {'a':10,'b':1,'c':22}
    >>> t = d.items()
    >>> t
    [('a',10),('c',22), ('b',1)]
    >>> t.sort()
    >>> t
    [('a',10),('b',1),('c',22)]

新的列表根據鍵值以字母升序排列。

通過字典進行多個賦值

將items方法、元組賦值與for循環結合起來,你可以擁有一個良好的代碼模式,使用單循環就可以遍歷字典中的鍵與值。

    for key,val in d.items():
        print val,key

這個循環中存在兩個迭代變量。由於items返回一個元組列表,變量key和val通過字典的鍵值對進行迭代,繼而得到賦值。
循環中的每次迭代都會使得key和value被賦予下一個字典鍵值對(仍然以哈希順序,也就是沒有特定順序)。

將兩種方法結合,按照每個鍵值對中的值來排序,輸出字典的內容。
要做到這一點,首先創建一個元組列表,其中每個元組爲(value, key)。通過items方法得到(key, value)元組列表。此時,我們想要根據value排序,而不是key。(value, key)元組列表一旦生成,排序就變得簡單了,按照反向次序對列表排序,輸出已
排序的新列表。

    >>> d = {'a':10,'b':1,'c':22}
    >>> l = list()
    >>> for key,val in d.items():
    ...     l.append((val,key)  )
    ...
    >>> l
    [(10,'a'),(22,'c'),(1,'b')]
    >>> l.sort(reverse=True)
    >>> l
    [(22,'c'),(10,'a'),(1,'b')]
    >>>

創建元組列表時要非常謹慎,確保每個元組的第一個元素是值,這樣就能對元組列表進行排序,獲得所需的字典內容,該字
典已按值進行排序。

高頻詞彙(信息分析)

輸出文本中出現次數最多的前十個單詞,代碼如下所示:

    import  string
    fhand = open('romeo-full.txt')
    counts = dict()
    for line in fhand:
        line = line.translate(None, string.punctuation)
        line = line.lower()
        words = line.split()
        for word in words:
            if  word not in counts:                                                     
                counts[word] = 1
            else:                                       
                counts[word] += 1
    #Sort the dictionary by value
    lst = list()
    for key,val in counts.items():
        lst.append( (val,   key)    )
    lst.sort(reverse=True)
    for key,val in lst[:10] :
        print key,val

簡潔,高效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章