算法设计与分析(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))

你可能感兴趣的:(python,算法)