lst
[-7, -3, -2, 5, 8]
m
'00001'
temp = zip(lst, m)
temp
[(-7, '0'), (-3, '0'), (-2, '0'), (5, '0'), (8, '1')]
压缩起来了,清晰不?
解压缩咋办?直接zip(*temp),这里的星号就是完成解压缩功能的
zip(*temp)
[(-7, -3, -2, 5, 8), ('0', '0', '0', '0', '1')]
zip(lst, m)
[(-7, '0'), (-3, '0'), (-2, '0'), (5, '0'), (8, '1')]
lambda x: x[1] != ‘0’
at 0x0000000003F1A908>
temp = filter(lambda x: x[1]!='0', zip(lst, m))
temp
[(8, '1')]
这里应该能明白filter功能了吧?对列表[(-7, ‘0’), (-3, ‘0’), (-2, ‘0’), (5, ‘0’), (8, ‘1’)]中的元素判断,过滤掉每个列表中元素如(-7,‘0’)这样式的元素,也就是lambda函数中的x, 找这些元素的第1个值,索引从0开始,所以要看看x[1]也就是(-7,‘0’)后面的这个第1个元素’0’,等于0的过滤掉,留下不等于‘0’的组成新的列表,所以结果等于[(8,‘1’)]
filter(lambda x: x[1]!='0', zip(lst, m))
[(8, '1')]
map(lambda x: x[0], filter(lambda x: x[1]!='0', zip(lst, m)))
[8]
m
'00001'
len(lst)
5
m.zfill(5)
'00001'
这个东东常用在对数字啊,序列啊,DNA,基因啥的进行编码的时候使用,将其转换为二进制编码
12. 接下来就到yield关键字了,这个在python中是生成器,用于生成可随时挂起随时调用的函数,类似于return,但是功能更强大,可以节省内存使用率。
13. 接下来的暴力破解就有意思了,不多说了,基础搞定,直接看算法,你的思路就完整建立了:
def subset_sum(lst, target):
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 = m.zfill(len(lst))
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_sum(lst, target)
print(list(k))