5.3. 字典與集合的生成式
如同串列及元組生成式,字典與集合同樣也有生成式可以被用來產生所需要的資料。
字典生成式
字典生成式的語法如下:
{鍵運算式: 值運算式 for 項目 in 可迭代項目}
>>> d = {i: i**2 for i in range(6)}
>>> d
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
>>> r = range(1, 11)
>>> type(r)
<class 'range'>
>>> d = {i: i + 2 for i in r}
>>> d
{1: 3, 2: 4, 3: 5, 4: 6, 5: 7, 6: 8, 7: 9, 8: 10, 9: 11, 10: 12}
>>> d = {i: i - 2 for i in r}
>>> d
{1: -1, 2: 0, 3: 1, 4: 2, 5: 3, 6: 4, 7: 5, 8: 6, 9: 7, 10: 8}
字典生成式中也可以包含 if 結構:
{鍵運算式: 值運算式 for 項目 in 可迭代項目 if 條件式}
>>> r = range(1, 11)
>>> d = {i: i * 2 for i in r if i <= 5}
>>> d
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10}
>>> d = {i: i / 2 for i in r if i > 5}
>>> d
{6: 3.0, 7: 3.5, 8: 4.0, 9: 4.5, 10: 5.0}
字典生成式也可以包含 if-else 結構:
{鍵運算式: 值運算式1 if 條件式 else 值運算式2 for 項目 in 可迭代項目}
>>> r = range(1, 11)
>>> d = {i: i * 2 if i <= 5 else i / 2 for i in r}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 3.0, 7: 3.5, 8: 4.0, 9: 4.5, 10: 5.0}
集合生成式
集合生成式的語法如下:
{運算式 for 項目 in 可迭代項目}
>>> s = {i for i in range(10)}
>>> s
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> r = range(1, 6)
>>> type(r)
<class 'range'>
>>> s = {i for i in r}
>>> s
{1, 2, 3, 4, 5}
集合生成式中也可以包含 if 結構:
{運算式 for 項目 in 可迭代項目 if 條件式}
>>> r = range(1, 11)
>>> s = {i for i in r if i <= 5}
>>> s
{1, 2, 3, 4, 5}
>>> s = {i for i in r if i > 5}
>>> s
{6, 7, 8, 9, 10}
另外,集合生成式中也可以包含 if-else 結構:
{運算式1 if 條件式 else 運算式2 for 項目 in 可迭代項目}
>>> r = range(1, 11)
>>> s = {i * 2 if i <= 5 else i / 2 for i in r}
>>> s
{2, 3.0, 4, 3.5, 6, 4.5, 8, 5.0, 10
參考資料
- 精通Python, 第四章, Bill Lubanovic著, 賴屹民譯, 歐萊禮