【问题标题】:Create of all possible combinations from 2 sets or lists as a dict从 2 个集合或列表中创建所有可能的组合作为 dict
【发布时间】:2021-10-20 13:32:14
【问题描述】:

我有 2 套(也可以是一个列表,但不确定它是否会有很大的不同)

set1 = (w1,w2,w3,w4)
set2 = (r1,r2,r3,r4,r5,r6,r7)

我想将所有可能的组合创建为 集合字典,其中 set1 的元素作为键,set2 作为值。集合值的最大长度为n

例如,对于n=3

样本输出

Comb1 = {w1:(r1,r2), w2:(r3), w3:(r4,r5,r6), w4:(r7)}
Comb2 = {w1:(r6), w2:(r1,r3), w3:(r2), w4:(r4,r5,r7)}
Comb3 = {w1:(r2), w2:(r1,r3), w3:(r4,r6), w4:(r6,r7)}
.
.
.
.

这里,在每个组合中,集合(或值)的最大长度为 3。

我正在查看 itertools 库,但不确定如何对设置的可变长度进行采样。我也考虑过从 set2 中不替换的随机抽样,但我不会从中得到所有可能的组合。

【问题讨论】:

    标签: python dictionary set combinatorics


    【解决方案1】:

    您可以使用递归生成器函数:

    import copy
    set1, n = ('w1','w2','w3','w4'), 3
    set2 = ('r1','r2','r3','r4','r5','r6','r7')
    def combos(d, c = []):
       if not d:
          yield c
       else:
          for i, a in enumerate(d):
             if (c1:=len(c)) + 1 <= (l1:=len(set1)):
                yield from combos(d[:i]+d[i+1:], c+[[a]])
             if ((_d:=d[:i]+d[i+1:]) or c1 == l1) and c and len(c[-1]) + 1 <= n:
                yield from combos(_d, [*c[:-1], c[-1]+[a]])
             
    r = combos(set2)
    print([dict(zip(set1, map(tuple, next(r)))) for _ in range(100)])
    

    输出(前 100 个结果):

    [{'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r5', 'r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r5', 'r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r5'), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r5'), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r6', 'r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r6', 'r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r6'), 'w4': ('r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r6'), 'w4': ('r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r7', 'r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4'), 'w4': ('r7', 'r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r7'), 'w4': ('r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r4', 'r7'), 'w4': ('r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r4', 'r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r4', 'r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r4'), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r4'), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r6', 'r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r6', 'r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r6'), 'w4': ('r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r6'), 'w4': ('r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r7', 'r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5'), 'w4': ('r7', 'r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r7'), 'w4': ('r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r5', 'r7'), 'w4': ('r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r4', 'r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r4', 'r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r4'), 'w4': ('r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r4'), 'w4': ('r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r5', 'r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r5', 'r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r5'), 'w4': ('r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r5'), 'w4': ('r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r7', 'r4', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6'), 'w4': ('r7', 'r5', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r7'), 'w4': ('r4', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r6', 'r7'), 'w4': ('r5', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r4', 'r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r4', 'r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r4'), 'w4': ('r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r4'), 'w4': ('r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r5', 'r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r5', 'r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r5'), 'w4': ('r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r5'), 'w4': ('r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r6', 'r4', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7'), 'w4': ('r6', 'r5', 'r4')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r6'), 'w4': ('r4', 'r5')}, {'w1': ('r1',), 'w2': ('r2',), 'w3': ('r3', 'r7', 'r6'), 'w4': ('r5', 'r4')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r5', 'r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r5', 'r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r5'), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r5', 'r6'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r5'), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r5', 'r7'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r6', 'r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r6', 'r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r6'), 'w4': ('r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r6', 'r5'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r6'), 'w4': ('r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r6', 'r7'), 'w4': ('r5',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r7', 'r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4',), 'w4': ('r7', 'r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r7'), 'w4': ('r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r7', 'r5'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r7'), 'w4': ('r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r4', 'r7', 'r6'), 'w4': ('r5',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r5',), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r5', 'r6'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r5',), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r5', 'r7'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r6',), 'w4': ('r5', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r6', 'r5'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r6',), 'w4': ('r7', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r6', 'r7'), 'w4': ('r5',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r7',), 'w4': ('r5', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r7', 'r5'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r7',), 'w4': ('r6', 'r5')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r4'), 'w3': ('r7', 'r6'), 'w4': ('r5',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r4', 'r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r4', 'r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r4'), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r4', 'r6'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r4'), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r4', 'r7'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r6', 'r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r6', 'r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r6'), 'w4': ('r4', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r6', 'r4'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r6'), 'w4': ('r7', 'r4')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r6', 'r7'), 'w4': ('r4',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r7', 'r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5',), 'w4': ('r7', 'r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r7'), 'w4': ('r4', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r7', 'r4'), 'w4': ('r6',)}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r7'), 'w4': ('r6', 'r4')}, {'w1': ('r1',), 'w2': ('r2', 'r3'), 'w3': ('r5', 'r7', 'r6'), 'w4': ('r4',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r5'), 'w3': ('r4',), 'w4': ('r6', 'r7')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r5'), 'w3': ('r4', 'r6'), 'w4': ('r7',)}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r5'), 'w3': ('r4',), 'w4': ('r7', 'r6')}, {'w1': ('r1',), 'w2': ('r2', 'r3', 'r5'), 'w3': ('r4', 'r7'), 'w4': ('r6',)}]
    

    【讨论】:

    • 这看起来很有希望。我会尝试一下并将其标记为解决方案。我对生成器函数非常陌生,所以我必须阅读它们,但你能告诉我在这种情况下如何获得生成器的长度吗?
    • @cppnoob 为了获得生成器可以为输入生成的结果数量,必须将整个生成器加载到内存中。在这种情况下,运行all_combos = list(combos(set2)); l = len(all_combos) 会得到组合的总数,但根据set2 的大小,代码可能会挂起很长时间,直到产生所有组合。
    • 谢谢!我可以将其作为 while(True) 运行,而不是将它们全部加载到内存中吗?
    • @cppnoob 是,例如:while (combo:=next(r, None)) is not None: pass #do something with combowhile 循环最终会耗尽生成器,让您提高内存效率。
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多