算法設計與分析(python)第二章代碼2.9-求子集和-代碼解析

一、函數解析:

1.Python zfill() 方法返回指定長度的字符串,原字符串右對齊,前面填充0
例子:
1->00001
2->00010

2.zip() 函數用於將可迭代的對象作爲參數,將對象中對應的元素打包成一個個元組,然後返回由這些元組組成的列表。
例子:
list1 = [1,2]
list2 =[3,4]
zip(list1,list2)
結果:
[(1,3),(2,4)]

3.bin() 返回一個整數 int 或者長整數 long int 的二進制表示。
例子:
print(bin(2))
結果:
ob10
所以要進行切片:
例子:
bin(i)[2:])
結果:
10
4.lambda lambda 可以理解爲一個簡易的函數“:”前面是形參,後面是表達式,表達式的值作爲返回值。
lambda x: x[0]

5…filter() 函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表
filter(function, iterable)
參數:

  • function – 判斷函數。
  • iterable – 可迭代對象
    當 function 返回值是True,則返回當前迭代的對象
    當 function 返回值是Fause,則不返回當前迭代的對象
    最後,將所有滿足條件函數的迭代對象,保存在一個新的列表或迭代對象返回。
    Python 3.x 返回迭代器
    Python 2.x 返回列表。

6.map()函數:
map() 會根據提供的函數對指定序列做映射。
第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。
簡單來說,就是把後面那個可迭代對象一個一個放到function裏面去,記錄返回結果
map(function, iterable, …)
Python 2.x 返回列表。
Python 3.x 返回迭代器。

二、代碼解析

def subset(lst,target):
    #i從1到2**len(lst)-1,一共執行2**n-1次
    for i in range(1,2**len(lst)):
        #得到一個列表
        pick = list(mask(lst,bin(i)[2:]))
        if sum(pick) == target:
            #返回迭代器
            yield pick


def mask(lst,m):
    #m的值每次都不一樣:1的位置不同,1的個數不同,如:00001,00010,00100
    #原字符串右對齊,左邊填充0
    m = m.zfill(len(lst))
    #filter()函數的作用:相當於m和lst取了一個與運算。我們把list中的每個元素看成是一個位子,lst = [-7,-3,-2,5,8]就有五個位子,
    #分別與00001,00010等進行zip操作,會變成一個二個元素的元組的列表,如00001和lst進行zip:[(0,-7),(0,-3),(0,-2),(0,5),(1,8)]再進行過濾,對於元組的第二個元素是0的元組捨去,是1的保留,並且返回元組
    #中的第一個數
    #Python 3.x 返回迭代器
    #Python 2.x 返回列表。
    return map(lambda x: x[0],filter(lambda x: x[1] !="0",zip(lst,m)))


lst = [-7,-3,-2,5,8]
target = 0
k = subset(lst,target)
print(next(k))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章