元組(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
簡潔,高效。