Python 通过集合列表嵌套循环

Python 通过集合列表嵌套循环,python,python-2.7,nested-loops,Python,Python 2.7,Nested Loops,我最近读了一篇文章,认为做以下事情不是一个好的做法: for i in xrange(len(string-or-list)): #do something with string-or-list[i] 我明白了。但是当涉及到嵌套循环时,我没有 考虑一个集合列表h。我想消除所有这些集合,它们是其他集合的子集。这就是我所做的: for x in xrange(len(h)-1,-1,-1): for y in xrange(x): if h[x] <= h[

我最近读了一篇文章,认为做以下事情不是一个好的做法:

for i in xrange(len(string-or-list)):
    #do something with string-or-list[i]
我明白了。但是当涉及到嵌套循环时,我没有

考虑一个集合列表
h
。我想消除所有这些集合,它们是其他集合的子集。这就是我所做的:

for x in xrange(len(h)-1,-1,-1):
    for y in xrange(x):
        if h[x] <= h[y]: h[x] = set()
        elif h[x] > h[y]: h[y], h[x] = h[x], set()
return filter(None, h)

最具python风格的事情是用你想要的集合组成一个新的列表。要删除重复项,我们需要一个helper函数

def uniq(seq):
    memo = []
    for i in seq:
        if i not in memo:
            memo.append(i)
            yield i
然后我们可以做我们想做的

return [s for s in uniq(h) if not any(s < o for o in h)]
返回[s代表uniq(h)中的s,如果没有(s
这是一个很好的pythonic,但是阅读您的初始代码时,您似乎在寻找子集(而不是严格的子集)

下面是一种解释单词子集通常含义的方法:

while True:
    for s in h:
        if sum(1 for o in h if s <= o) > 1:
            h.remove(s)
            break
    else:
        # no subsets were found - we're done
        break
为True时:
对于h中的s:
如果和(o为1,h为1,如果s为1:
h、 移走
打破
其他:
#没有找到子集-我们完成了
打破

任何集合都是其自身的子集而不是严格的子集。这就是
omg,真不敢相信我如此愚蠢…谢谢。当我第一次编写函数时,我使用了另一种方法,无法使用列表理解。但是现在,当然了!他们应该让我在这个问题上降低声誉点。今天过得不好!@Pigna我编辑了我对cor的回答对于重复的情况,我猜这可能会有问题,因为每当s在列表中出现两次时,所有实例都将被删除。如果没有重复,则与我的解决方案相同。谢谢!可能会出现重复。因此,我猜解决方案是:
return[s for s in h if sum(1 for o in set(h))如果是哦,是的,那是真的。我会修改它。你希望复制品怎么样?它们中的任何一个?还是只有一个
while True:
    for s in h:
        if sum(1 for o in h if s <= o) > 1:
            h.remove(s)
            break
    else:
        # no subsets were found - we're done
        break