天天看點

Python内置容器(2)——字典,疊代器,清單解析

1.疊代器 iterator

    iter 函數,構造集合。

    next 方法依次傳回疊代器的值

In [42]: li

Out[42]: [1, 2, 3, 4, 5]

In [43]: it = iter(li)

In [44]: it.next()

Out[44]: 1

In [45]: it.next()

Out[45]: 2

    當所有的元素都傳回完的時候,會抛出一個StopIterator 的異常。

    list,tuple,set 都屬于集合。

    for 語句,當将一個清單傳遞給for 語句的時候,實際上for 語句會将清單轉換為疊代器,然後隐示的地執行該疊代器。

    2. 字典 dict

    2.1 定義與初始化 In [46]: d = {}

In [47]: type(d)

Out[47]: dict

In [48]: d = {'a':1,'v':'k'}

In [49]: d

Out[49]: {'a': 1, 'v': 'k'}

在字典中key是不允許重複的,是以字典中的key必須是可hash的對象。

    2.2字典的操作

    2.2.1 keys 将字典的所有key作為一個清單傳回In [50]: d

Out[50]: {'a': 1, 'v': 'k'}

In [51]: d.keys()

Out[51]: ['a', 'v']

    2.2.2 iterkeys 将字典的所有key作為一個疊代器傳回

In [52]: d.iterkeys()

Out[52]: <dictionary-keyiterator at 0x12ff7e0>

In [53]: it = d.iterkeys()

In [54]: it.next()

Out[54]: 'a'

    2.2.3 values 傳回一個清單,該清單是所有元素的值

In [55]: d

Out[55]: {'a': 1, 'v': 'k'}

In [56]: d.values()

Out[56]: [1, 'k']

    2.2.4 items ,傳回一個清單,清單中的每個元素是一個元組,元組中的兩個值分别是key和value

In [57]: d

Out[57]: {'a': 1, 'v': 'k'}

In [58]: d.items()

Out[58]: [('a', 1), ('v', 'k')]

周遊一個字典:

In [59]: for v in d.values():

....:

print v

1

k

In [60]: for k,v in d.items():

print "%s => %s" % (k,v)

a => 1

v => k

    2.3.5 get ,按照key取值,若存在則傳回,否則傳回None

In [61]: d.get('a')

Out[61]: 1

還可以給get 傳遞第二個參數,表示若key不存在,則傳回某個值。

In [65]: d.get('xx',100)

Out[65]: 100

    2.2.6 has_key ,判斷某個key是否存在

In [63]: d.has_key('a')

Out[63]: True

In [64]: d.has_key('aa')

Out[64]: False

    2.3給字典增加一個鍵值對:

In [66]: d = {}

In [67]: d['c'] = 1

In [68]: d

Out[68]: {'c': 1}

In [69]: d['xx'] = 100

In [70]: dOut[70]: {'c': 1, 'xx': 100}

In [71]: d['xx'] = 200

In [72]: d

Out[72]: {'c': 1, 'xx': 200}

    2.4update 操作

In [73]: d

Out[73]: {'c': 1, 'xx': 200}

In [74]: d.update({'a':1,'b':2})

In [75]: d

Out[75]: {'a': 1, 'b': 2, 'c': 1, 'xx': 200}

    2.5 python字典為引用傳值,如:

In [76]: d

Out[76]: {'a': 1, 'b': 2, 'c': 1, 'xx': 200}

In [77]: d1 = d

In [78]: d1['a'] = 200

In [79]: d1

Out[79]: {'a': 200, 'b': 2, 'c': 1, 'xx': 200}

In [80]: d

Out[80]: {'a': 200, 'b': 2, 'c': 1, 'xx': 200}

    2.6 copy 操作:重新複制一個字典

In [81]: d

Out[81]: {'a': 200, 'b': 2, 'c': 1, 'xx': 200}

In [82]: d2 = d.copy()

In [83]: d2

Out[83]: {'a': 200, 'b': 2, 'c': 1, 'xx': 200}

In [84]: d2['a'] = 300

In [85]: d2

Out[85]: {'a': 300, 'b': 2, 'c': 1, 'xx': 200}

In [86]: d

Out[86]: {'a': 200, 'b': 2, 'c': 1, 'xx': 200}

In [87]: id(d)

Out[87]: 19662176

In [88]: id(d2)

Out[88]: 19501072

In [89]: id(d1)

Out[89]: 19662176

3.清單解析

    [expression for item in iterator] 一個最基本的清單解析,傳回一個清單

    在expression 可以使用item 變量

    傳回一個疊代器

(expression for item in terator)

In [90]: li = [1,2,3]

In [91]: l = (x+1 for x in li)

In [92]: l

Out[92]: <generator object <genexpr> at 0x12fa730>

In [93]: l.next()

Out[93]: 2In [94]: l.next()

Out[94]: 3

        疊代器是惰性求值,隻有用到了才會計算該值,否則不會。清單是先求出所有值的。是以當資料大的時候疊代器有較好的性能。

    帶條件的清單解析

[expression for item in iterator if condition] ,當滿足條件的時候才會append到清單中,并傳回。當變為小括号的時候,就會傳回一個疊代器。

In [95]: li

Out[95]: [1, 2, 3]

In [96]: [x for x in li if x % 2 ==0]

Out[96]: [2]

    帶多個條件 [expression for item in iterator if conditionX if conditionY]

    帶多個疊代器(笛卡爾積與清單解析):[expr for x in IterX for y in IterY] ,類似于兩個嵌套的for循環操作

In [99]: [(x,y) for x in [1,2,3] for y in [1,3]]

Out[99]: [(1, 1), (1, 3), (2, 1), (2, 3), (3, 1), (3, 3)]

    清單解析的性能遠高于循環語句。

本文轉自willis_sun 51CTO部落格,原文連結:http://blog.51cto.com/willis/1855129,如需轉載請自行聯系原作者