天天看點

一個用到filter,map,reduce的小問題

     今天碰到一個小程式,正好可以用到Python的filter,map和reduce方法。感覺很有意思,順便就寫下來吧。問題是這樣的:

     兩個小夥伴,數字214和77感覺自己的運氣一直不好,想來想去,原來是和7有關,如下:

2+1+4=7
77%7=11
7%11=77
           

      滿足如下規則就是和7有關,

1. 本身是7的倍數
2. 數字裡包含7
3. 數字各位累加時7的倍數
           

下一個小程式,計算出一定範圍内和7不相關的數字的平方和。

    題目很簡單,可以用各種語言實作,這裡的demo是Python實作的。

    我們可以把這個過程分成這樣幾個步驟:

  •     産生一定範圍内的數字
  •     去掉和7相關的數字
  •     計算平方和

    第一步很簡單:

    range(), 10以内的range(10), 即: [1,2,3,4,5,6,7,8,9]

     第二部過濾:

     filter(function or None, sequence) -> list, tuple, or string

     reduce(function, sequence[, initial]) -> value

    function如下:

def handle(num,noluck=7):
	if num %noluck==0:
		return False
	l = [string.atoi(x) for x in str(num)]
	for num in l:
		if num%noluck==0:
			return False
	if reduce(lambda x,y:x+y, l)%noluck==0:
		return False
	return True
           

     這樣去掉之後的結果是:filter(handle, range(10))

      第三部是計算:

      map(function, sequence[, sequence, ...]) -> list

reduce(lambda x,y: x+y, map(lambda x:x*x,filter(handle, range(10))))
           

 這裡還用到了lambda和表達式推導。是不是很有意思?隻有真正玩python的人才知道其中好玩的地方 :-)