【问题标题】:Generating subsets of n-element set; function doesn't return anything生成 n 元素集的子集;函数不返回任何东西
【发布时间】:2013-11-03 15:45:53
【问题描述】:
def nast(L):
    i=len(L)-1
    while L != [1 for i in range(len(L))]:
        if L[i]==0:
            L[i]=1
            break
        i=i-1
    for j in range(i+1,len(L)):
        L[j]=0
    return L

def extr(dss,bb):
    for i in list(dss.keys()):
        if bb[i]==0:
            dss.pop(i)
    w=list(dss.values())
    return w

def GenSet(ss):
    L1=[0 for i in range(len(ss))]
    w=[()]
    while L1 != [1 for i in range(len(ss))]:
        dss=dict(zip([i for i in range(len(ss))],list(ss)))
        tL1=tuple(nast(L1))
        temp=extr(dss,tL1)
        temp1=tuple(temp)
        w.append(temp1)
    ww= [set(x) for x in w]
    return ww, len(ww)

我希望此代码生成 n 元素集的子集。不幸的是,GenSet() 既不返回值,也不返回错误;它使 Ipython 的 shell 崩溃。

【问题讨论】:

    标签: python set combinations ipython subset


    【解决方案1】:

    一个陷阱:

    i=len(L)-1
    while L != [1 for i in range(len(L))]:
    

    列表推导中出现的i 将覆盖另一个。

    【讨论】:

    • 这取决于python版本。它将在 python i 被保留,因为它们位于不同的范围内。
    • 感谢您的回答;如果您愿意帮助并分享这个问题的解决方案,这会是一个问题吗?你能告诉我“for”之前的“1”是什么意思吗? (这段代码不是我写的,但我确实需要编译)
    【解决方案2】:

    我没有读过你的代码,但是你考虑过用 itertools 代替吗?

    下面的 sn-p 将生成所有大小为 n 的子集:

    import itertools
    def subsets(bigset,n):
        return itertools.combinations(bigset, n)
    

    然后您可以简单地将结果连接在一起。

    【讨论】:

    • 函数subsets完全是徒劳的。您只是在对itertools.combinations 的普通调用中增加开销。如果您想为清晰起见提供其他名称,只需执行 subsets = itertools.combinations 即可获得与您的代码相同的效果,但不会增加开销。
    • 对于任何现场使用,您都是正确的。这是一个示范性的例子。
    猜你喜欢
    • 2016-11-10
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多