Python 3 – [s for subsets(S)]和yield

这是我在互联网上找到的一些代码,它没有太多解释.我只是好奇它是如何工作的.我不完全理解产量和[子集(S)中s的s]部分.任何见解都将非常感谢!

def subsets(aList):

       if aList ==[]:   # base case
          yield []
       else:
          first = aList[0]
          rest  = aList[1:]
          for ss in subsets(rest):  # include first or don't in each
              yield ss                   # subset of rest
              yield [first]+ss

print ("\n testing subsets")
S = ['A','B','C','D','E']

ss = [s for s in subsets(S)]

print ("The subsets of",S,"are:")

print (ss)

解决方法:

子集是一个生成器:当您调用它时,您可以创建一个可以迭代的对象.每次迭代从中请求另一个值时,它将运行到下一个yield语句,并生成该值.它也是递归的,所以当你用五个项目运行它时,它会在最后四个项目中调用它,依此类推.

因此,如果它传递了[‘A’],它会创建第二个生成器,它会传递一个空列表[].这只会产生一个空列表,然后完成.主发电机将接收它,产生它(产量ss),然后产生[first] ss,这将是[‘A’].总结果:[[],[‘A’]]

[子集(S)中s的s]是列表理解.它相当于:

ss = []
for s in subsets(S)
    ss.append(s)

在这种情况下,它是多余的 – 你可以只做列表(子集(S))来实现同样的事情.当您想要对每个对象集合执行某些操作时,或者如果要对其进行过滤,则使用列表推导.

上一篇:[GDOI2018]滑稽子图


下一篇:loj2340 WC2018 州区划分 状压dp+FWT