你可能不知道的30個Python語言的特點技巧(3)

pythontab發表於2014-04-10

從我開始學習Python時我就決定維護一個經常使用的“竅門”列表。不論何時當我看到一段讓我覺得“酷,這樣也行!”的程式碼時(在一個例子中、在StackOverflow、在開原始碼軟體中,等等),我會嘗試它直到理解它,然後把它新增到列表中。這篇文章是清理過列表的一部分。如果你是一個有經驗的Python程式設計師,儘管你可能已經知道一些,但你仍能發現一些你不知道的。如果你是一個正在學習Python的C、C++或Java程式設計師,或者剛開始學習程式設計,那麼你會像我一樣發現它們中的很多非常有用。

每個竅門或語言特性只能透過例項來驗證,無需過多解釋。雖然我已盡力使例子清晰,但它們中的一些仍會看起來有些複雜,這取決於你的熟悉程度。所以如果看過例子後還不清楚的話,標題能夠提供足夠的資訊讓你透過Google獲取詳細的內容。

列表按難度排序,常用的語言特徵和技巧放在前面。

1.30   最大最小元素 (heapq.nlargest和heapq.nsmallest)

>>> a = [random.randint(0, 100) for __ in xrange(100)]  

>>> heapq.nsmallest(5, a)  

[3, 3, 5, 6, 8]  

>>> heapq.nlargest(5, a)  

[100, 100, 99, 98, 98] 

1.31   笛卡爾乘積 (itertools.product)

>>> for p in itertools.product([1, 2, 3], [4, 5]):  

(1, 4)  

(1, 5)  

(2, 4)  

(2, 5)  

(3, 4)  

(3, 5)  

>>> for p in itertools.product([0, 1], repeat=4):  

...     print ''.join(str(x) for x in p)  

...  

0000 

0001 

0010 

0011 

0100 

0101 

0110 

0111 

1000 

1001 

1010 

1011 

1100 

1101 

1110 

1111 

1.32   組合的組合和置換 (itertools.combinations 和 itertools.combinations_with_replacement)

>>> for c in itertools.combinations([1, 2, 3, 4, 5], 3):  

...     print ''.join(str(x) for x in c)  

...  

123 

124 

125 

134 

135 

145 

234 

235 

245 

345 

>>> for c in itertools.combinations_with_replacement([1, 2, 3], 2):  

...     print ''.join(str(x) for x in c)  

...  

11 

12 

13 

22 

23 

33 

1.33   排序 (itertools.permutations)

>>> for p in itertools.permutations([1, 2, 3, 4]):  

...     print ''.join(str(x) for x in p)  

...  

1234 

1243 

1324 

1342 

1423 

1432 

2134 

2143 

2314 

2341 

2413 

2431 

3124 

3142 

3214 

3241 

3412 

3421 

4123 

4132 

4213 

4231 

4312 

4321 

1.34   連結的迭代 (itertools.chain)

>>> a = [1, 2, 3, 4]  

>>> for p in itertools.chain(itertools.combinations(a, 2), itertools.combinations(a, 3)):  

...     print p  

...  

(1, 2)  

(1, 3)  

(1, 4)  

(2, 3)  

(2, 4)  

(3, 4)  

(1, 2, 3)  

(1, 2, 4)  

(1, 3, 4)  

(2, 3, 4)  

>>> for subset in itertools.chain.from_iterable(itertools.combinations(a, n) for n in range(len(a) + 1))  

...     print subset  

...  

()  

(1,)  

(2,)  

(3,)  

(4,)  

(1, 2)  

(1, 3)  

(1, 4)  

(2, 3)  

(2, 4)  

(3, 4)  

(1, 2, 3)  

(1, 2, 4)  

(1, 3, 4)  

(2, 3, 4)  

(1, 2, 3, 4) 

1.35   按給定值分組行 (itertools.groupby)

>>> from operator import itemgetter  

>>> import itertools  

>>> with open('contactlenses.csv', 'r') as infile:  

...     data = [line.strip().split(',') for line in infile]  

...  

>>> data = data[1:]  

>>> def print_data(rows):  

...     print '\n'.join('\t'.join('{: <16}'.format(s) for s in row) for row in rows)  

...  

 

>>> print_data(data)  

young               myope                   no                      reduced                 none  

young               myope                   no                      normal                  soft  

young               myope                   yes                     reduced                 none  

young               myope                   yes                     normal                  hard  

young               hypermetrope            no                      reduced                 none  

young               hypermetrope            no                      normal                  soft  

young               hypermetrope            yes                     reduced                 none  

young               hypermetrope            yes                     normal                  hard  

pre-presbyopic      myope                   no                      reduced                 none  

pre-presbyopic      myope                   no                      normal                  soft  

pre-presbyopic      myope                   yes                     reduced                 none  

pre-presbyopic      myope                   yes                     normal                  hard  

pre-presbyopic      hypermetrope            no                      reduced                 none  

pre-presbyopic      hypermetrope            no                      normal                  soft  

pre-presbyopic      hypermetrope            yes                     reduced                 none  

pre-presbyopic      hypermetrope            yes                     normal                  none  

presbyopic          myope                   no                      reduced                 none  

presbyopic          myope                   no                      normal                  none  

presbyopic          myope                   yes                     reduced                 none  

presbyopic          myope                   yes                     normal                  hard  

presbyopic          hypermetrope            no                      reduced                 none  

presbyopic          hypermetrope            no                      normal                  soft  

presbyopic          hypermetrope            yes                     reduced                 none  

presbyopic          hypermetrope            yes                     normal                  none  

 

>>> data.sort(key=itemgetter(-1))  

>>> for value, group in itertools.groupby(data, lambda r: r[-1]):  

...     print '-----------' 

...     print 'Group: ' + value  

...     print_data(group)  

...  

-----------  

Group: hard  

young               myope                   yes                     normal                  hard  

young               hypermetrope            yes                     normal                  hard  

pre-presbyopic      myope                   yes                     normal                  hard  

presbyopic          myope                   yes                     normal                  hard  

-----------  

Group: none  

young               myope                   no                      reduced                 none  

young               myope                   yes                     reduced                 none  

young               hypermetrope            no                      reduced                 none  

young               hypermetrope            yes                     reduced                 none  

pre-presbyopic      myope                   no                      reduced                 none  

pre-presbyopic      myope                   yes                     reduced                 none  

pre-presbyopic      hypermetrope            no                      reduced                 none  

pre-presbyopic      hypermetrope            yes                     reduced                 none  

pre-presbyopic      hypermetrope            yes                     normal                  none  

presbyopic          myope                   no                      reduced                 none  

presbyopic          myope                   no                      normal                  none  

presbyopic          myope                   yes                     reduced                 none  

presbyopic          hypermetrope            no                      reduced                 none  

presbyopic          hypermetrope            yes                     reduced                 none  

presbyopic          hypermetrope            yes                     normal                  none  

-----------  

Group: soft  

young               myope                   no                      normal                  soft  

young               hypermetrope            no                      normal                  soft  

pre-presbyopic      myope                   no                      normal                  soft  

pre-presbyopic      hypermetrope            no                      normal                  soft  

presbyopic          hypermetrope            no                      normal                  soft 


相關文章