【Python 技巧】[i for i in range(1,10)] — 列表解析式,列表中使用 for 循環

經常會看到類似於 [i for i in range(1,10)] 的表達式,這種表達式稱爲列表解析(List Comprehensions),類似的還有字典解析、集合解析等等。

列表解析式是將一個列表(實際上適用於任何可迭代對象)轉換成另一個列表的工具。在轉換過程中,可以指定元素必須符合一定的條件,才能添加至新的列表中,這樣每個元素都可以按需要進行轉換。

每個列表解析式都可以重寫爲 for 循環,但不是每個 for 循環都能重寫爲列表解析式,列表解析比 for 更精簡,運行更快。


基本語法

[expression for iter_val in iterable]

[expression for iter_val in iterable if cond_expr]


列表解析式

舉例說明,將 1-10 每個數乘以 2 放入一個列表:

用 for 循環實現如下:

>>> li = []
>>> for i in range(1, 11):
	li.append(i*2)


>>> print(li)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

用列表解析式實現如下:

>>> li = [i*2 for i in range(1, 11)]
>>> print(li)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

篩選條件

此外列表解析式還支持添加篩選條件,例如篩選出 i*2>10 的數:

>>> li = [i*2 for i in range(1, 11) if i*2 > 10]
>>> print(li)
[12, 14, 16, 18, 20]

嵌套循環

更復雜一點,嵌套循環也可以轉換成列表解析式,先看一個普通的嵌套循環:

>>> li1 = ['A', 'B', 'C']
>>> li2 = ['1', '2', '3']
>>> li3 = []
>>> for m in li1:
	for n in li2:
		li3.append((m,n))

		
>>> print(li3)
[('A', '1'), ('A', '2'), ('A', '3'), ('B', '1'), ('B', '2'), ('B', '3'), ('C', '1'), ('C', '2'), ('C', '3')]

列表解析式實現如下:

>>> li1 = ['A', 'B', 'C']
>>> li2 = ['1', '2', '3']
>>> li3 = [(m,n) for m in li1 for n in li2]
>>> print(li3)
[('A', '1'), ('A', '2'), ('A', '3'), ('B', '1'), ('B', '2'), ('B', '3'), ('C', '1'), ('C', '2'), ('C', '3')]

字典解析式

普通 for 循環:

>>> a = {'language1':'python', 'language2':'java','language3':'c'}
>>> b = {}
>>> for key, value in a.items():
	if key == 'language1':
		b[key] = value

		
>>> print(b)
{'language1': 'python'}

用字典解析式實現如下:

>>> a = {'language1':'python', 'language2':'java','language3':'c'}
>>> b = {key: value for key, value in a.items() if key == 'language1'}
>>> print(b)
{'language1': 'python'}

集合解析式

普通 for 循環:

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> b = set()     # 創建一個空集合
>>> for i in a:
	if i > 5:
		b.add(i)

		
>>> print(b)
{6, 7, 8, 9, 10}

用集合解析式實現如下:

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> b = {i for i in a if i > 5}
>>> print(b)
{6, 7, 8, 9, 10}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章