2

我有一个字符串列表:

l = ['a', 'b', 'c']

我想在不同大小的组中创建列表元素的所有可能组合。我希望这是一个元组的列表,但它也可以是列表的列表等。元组的顺序和元组中的元组的顺序无关紧要。元组或元组的元组中都不能重复列表元素。对于上面的列表,我希望是这样的:

[(('a'),('b'),('c')),
 (('a', 'b'), ('c')),
 (('a', 'c'), ('b')),
 (('b', 'c'), ('a')),
 (('a', 'b', 'c'))]

任何帮助是极大的赞赏。

编辑:我确实要求列表中的每个元组都包含 l 的所有元素。senderle 和 Antimony,关于遗漏,您都是正确的。

4

2 回答 2

3

这是做事的一种方法。不知道有没有更优雅的方法。该itertools模块具有组合和排列功能,但不幸的是,没有分区功能。

编辑:我的第一个版本不正确,但幸运的是,我已经从我做的一个旧项目中得到了这个。

您还可以通过返回d而不是d.values(). 这对于有效测试一个分区是否是另一个分区的细化很有用。

def connectivityDictSub(num, d, setl, key, i):
    if i >= num:
        assert(key not in d)
        d[key] = setl
    else:
        for ni in range(len(setl)):
            nsetl, nkey = setl[:], key
            for other in nsetl[ni]:
                assert(other != i)
                x,y = sorted((i, other))
                ki = ((2*num-3-x)*x)/2 + y-1
                nkey |= 1<<ki
            nsetl[ni] = nsetl[ni] + [i] #not the same as += since it makes a copy
            connectivityDictSub(num, d, nsetl, nkey, i+1)
        nsetl = setl + [[i]]
        connectivityDictSub(num, d, nsetl, key, i+1)

def connectivityDict(groundSet):
    gset = sorted(set(groundSet))
    d = {}
    connectivityDictSub(len(gset), d, [], 0, 0)
    for setl in d.values():
        setl[:] = [tuple(gset[i] for i in x) for x in setl]
    return map(tuple, d.values())

for x in connectivityDict('ABCD'):
    print x
于 2012-10-12T01:32:58.937 回答
2

itertools应该可以完成您想要的大部分工作。

例子:

stuff = [1, 2, 3]
for L in range(0, len(stuff)+1):
  for subset in itertools.combinations(stuff, L):
    print(subset)

这个例子只是为了展示 itertools。您必须弄清楚才能获得所需的确切输出。

于 2012-10-12T01:34:04.097 回答