03 November, 2008

Python Idiom: list comprehensions

寫程式時常常會遇到許多的 for 跟 if,如下面的範例
numbers = [1,2,3,4,5,6]
squares = []
for n in numbers:
     if n % 2 == 0:
         squares.append(n*n)
上述程式碼將 numbers 中是偶數的元素平方之後加到 squares。利用 list comprehensions 只要一行程式碼就可以完成目的。
squares = [n*n for n in numbers if n % 2 == 0]
請注意程式的可讀性是不是並沒有因為程式碼的縮短而減少呢? 其實 list comprehensions 中可以有很多個 for 跟 很多個 if, 不過使用時要斟酌一下,如果真的有很多個 for 跟 if, 最好考慮使用一般的寫法,不然程式就會變得不易閱讀。 下面的例子使用了2個 for
nums = [1,2,3]
fruit = ["Apples", "Peaches", "Bananas"]
print [(i,f) for i in nums for f in fruit]
上面的程式會印出
[(1, 'Apples'), (1, 'Peaches'), (1, 'Bananas'),
 (2, 'Apples'), (2, 'Peaches'), (2, 'Bananas'),
 (3, 'Apples'), (3, 'Peaches'), (3, 'Bananas')]
下面的例子使用了2個 for 跟2個 if
nums = [1,2,3]
fruit = ["Apples", "Peaches", "Bananas"]
print [(i,f) for i in nums for f in fruit
       if i % 2 == 1 if f[0] == 'P']
上面的程式會印出
[(1, 'Peaches'), (3, 'Peaches')]

No comments: