1. 程式人生 > >Day9 python高級特性-- 列表生成式 List Comprehensions

Day9 python高級特性-- 列表生成式 List Comprehensions

roc 更多 篩選 implicit os模塊 CI 但是 lib div

Python內置的非常簡單卻強大的可以用來創建list的生成式。
私理解為,就是for循環出來的結果搞成個list~~~~

要生成順序增量list可以使用list(range(x,y))來進行,如:
>>> list(range(1,11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(-12,-1))
[-12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2]
>>> list(range(11,1))
[]
>>> list(range(-1,-12))
[]

但是要生成[1x1, 2x2, 3x3, 4x4, ..., 10x10]怎麽做呢?可以用for循環:
>>> L = []
>>> for i in range(1,11): #為什麽是11?想想。
... L.append(i * i)
...
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

也可以用列表生成式,更容易的實現:
>>> [x * x for x in range(1,11)]

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

列表生成式:
要生成的元素放到前面,後面跟for循環,就可以輕松的創建出list了。

1. for循環後可以加上if判斷,如計算奇數的平方
>>> [ x * x for x in range(1,11) if x % 2 == 1]
[1, 9, 25, 49, 81] 2. 也可以對for循環做多層嵌套,如兩層:
>>> [ m + n for m in ‘ABCD‘ for n in ‘abcdef‘ ]

[‘Aa‘, ‘Ab‘, ‘Ac‘, ‘Ad‘, ‘Ae‘, ‘Af‘, ‘Ba‘, ‘Bb‘, ‘Bc‘, ‘Bd‘, ‘Be‘, ‘Bf‘, ‘Ca‘, ‘Cb‘, ‘Cc‘, ‘Cd‘, ‘Ce‘, ‘Cf‘, ‘Da‘, ‘Db‘, ‘Dc‘, ‘Dd‘, ‘De‘, ‘Df‘]
三層和三層以上用的很少。 3. for循環可以同時使用兩個以及更多個變量
>>> a = { ‘a‘: ‘A‘, ‘b‘: ‘B‘, ‘c‘: ‘C‘ }
>>> [ Alpha + ‘=‘ + Num for Alpha, Num in a.items() ]
[‘c=C‘, ‘b=B‘, ‘a=A‘]

發現一個問題,如果有一個變量為int類型,則會出問題:
>>> a = { ‘a‘: 1, ‘b‘: 2, ‘c‘: 3 }
>>> [ A + ‘=‘ + N for A, N in a.items() ]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
TypeError: Can‘t convert ‘int‘ object to str implicitly 這樣就好了:
>>> [ A + ‘=‘ + str(N) for A , N in a.items()]
[‘c=3‘, ‘b=2‘, ‘a=1‘]

練習:
1.把list中所有字符串變成小寫
>>> a = [‘ABC‘, ‘DEF‘, ‘GHI‘]
>>> [ i.lower() for i in a]
[‘abc‘, ‘def‘, ‘ghi‘]
2.把list中的單詞變成首字母大寫
>>> a = [‘abc‘, ‘def‘, ‘ghi‘]
>>> [ i[0].upper() + i[1:].lower() for i in a]
[‘Abc‘, ‘Def‘, ‘Ghi‘]
3.前兩個練習中的list如果出現數字,如何保證依然正確處理。
#引入: 可以用isinstance()函數來判斷是否為str
>>> a = [‘ABC‘, ‘DEF‘, ‘GHI‘, None, 123, 555]
>>> [ i.lower() for i in a if isinstance(i, str) == True ]
[‘abc‘, ‘def‘, ‘ghi‘] >>> a = [‘abc‘, ‘def‘, ‘ghi‘, None, 123, ‘ABC‘]
>>> [ i[0].upper() + i[1:].lower() for i in a if isinstance(i, str)
]
[‘Abc‘, ‘Def‘, ‘Ghi‘, ‘Abc‘]

4.在3的基礎上,能讓非字符串也顯示出來麽?
>>> a = [‘abc‘, ‘def‘, ‘ghi‘, None, 123, ‘ABC‘]
>>> [ i[0].upper() + i[1:].lower() if isinstance(i, str) else i for i in a ]
[‘Abc‘, ‘Def‘, ‘Ghi‘, None, 123, ‘Abc‘]
#這塊的用法和老廖的課程上有些不同,理解理解。
#先判斷是否滿足條件,滿足則轉換,不滿足則不變。
#而之前的是,先轉換,再根據條件篩選結果?應該是這樣的。

擴展:使用os模塊的listdir,列出操作系統的文件和目錄
>>> import os
>>> os.listdir(‘/‘)
[‘bin‘, ‘boot‘, ‘dev‘, ‘etc‘, ‘home‘, ‘init‘, ‘lib‘, ‘lib64‘, ‘media‘, ‘mnt‘, ‘opt‘, ‘proc‘, ‘root‘, ‘run‘, ‘sbin‘, ‘srv‘, ‘sys‘, ‘tmp‘, ‘usr‘, ‘var‘]

>>> a = [ ‘ls /‘ + n for n in os.listdir(‘/‘) ]
>>> for i in range(0,len(a)):
... print(a[i])
...
ls /bin
ls /boot
ls /dev
ls /etc
ls /home
ls /init
ls /lib
ls /lib64
ls /media
ls /mnt
ls /opt
ls /proc
ls /root
ls /run
ls /sbin
ls /srv
ls /sys
ls /tmp
ls /usr
ls /var
#shell腳本裏最喜歡幹的事情~~

Day9 python高級特性-- 列表生成式 List Comprehensions