代码之家  ›  专栏  ›  技术社区  ›  neo4k

在Python中,流式处理嵌套列表(列表列表)中元素的所有无序/无序唯一排列?

  •  0
  • neo4k  · 技术社区  · 7 年前

    我有两级嵌套列表,如下所示。

    [[0, 1], [2], [3, 4], [5, 5], [6], [7], [8], [9], [10, 11], [12]]
    

    唯一置换 但我的应用程序 绝对需要输出是(伪)随机和无序的。 通常,置换策略按顺序生成置换,但我希望能够按顺序生成所有置换。

    MUST 可以通过一些生成器来完成,因为嵌套列表可能很长,并且唯一置换的数量可以组合爆炸。

    例如,上述列表需要以下输出。

    (0, 2, 3, 5, 6, 7, 8, 9, 10, 12)
    (1, 2, 3, 5, 6, 7, 8, 9, 10, 12)
    (0, 2, 3, 5, 6, 7, 8, 9, 11, 12)
    (1, 2, 4, 5, 6, 7, 8, 9, 10, 12)
    (0, 2, 4, 5, 6, 7, 8, 9, 10, 12)
    (1, 2, 3, 5, 6, 7, 8, 9, 11, 12)
    (1, 2, 4, 5, 6, 7, 8, 9, 11, 12)
    (0, 2, 4, 5, 6, 7, 8, 9, 11, 12)
    

    (0, 2, 3, 5, 6, 7, 8, 9, 11, 12)
    (0, 2, 3, 5, 6, 7, 8, 9, 10, 12)
    (0, 2, 3, 5, 6, 7, 8, 9, 11, 12)
    (0, 2, 3, 5, 6, 7, 8, 9, 10, 12)
    (0, 2, 4, 5, 6, 7, 8, 9, 11, 12)
    (0, 2, 4, 5, 6, 7, 8, 9, 10, 12)
    (0, 2, 4, 5, 6, 7, 8, 9, 11, 12)
    (0, 2, 4, 5, 6, 7, 8, 9, 10, 12)
    (1, 2, 3, 5, 6, 7, 8, 9, 11, 12)
    (1, 2, 3, 5, 6, 7, 8, 9, 10, 12)
    (1, 2, 3, 5, 6, 7, 8, 9, 11, 12)
    (1, 2, 3, 5, 6, 7, 8, 9, 10, 12)
    (1, 2, 4, 5, 6, 7, 8, 9, 11, 12)
    (1, 2, 4, 5, 6, 7, 8, 9, 10, 12)
    (1, 2, 4, 5, 6, 7, 8, 9, 11, 12)
    (1, 2, 4, 5, 6, 7, 8, 9, 10, 12)
    

    即使是一些解决方案,也完全符合itertools的要求。产品确实如此,但生成无序排列将对我有很大帮助。感谢您的帮助。

    下面的代码说明了我现有的方法。

    def perm_attempt():
        meta_seq = [[0, 1], [2], [3, 4], [5, 5], [6], [7], [8], [9], [10, 11], [12]]
        print meta_seq
        iter_count = np.prod([len(set(x)) for x in meta_seq])
        print iter_count
        print
        set_l = set()
        for _ in xrange(iter_count*10):
            l = [np.random.choice(x) for x in meta_seq]
            # print l
            set_l.add(tuple(l))
        print
        print len(set_l)
        print
        # for s in set_l:
        #     print s
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Gustavo Bezerra    7 年前

    您可以尝试迭代以下生成器:

    def random_perm(l):
        while True:
            yield [random.choice(sublist) for sublist in l]
    

    示例用法:

    l = [[0, 1], [2], [3, 4], [5, 5], [6], [7], [8], [9], [10, 11], [12]]
    g = random_perm(l)
    for _ in range(10):
        print(next(g))
    

    输出:

    [0, 2, 4, 5, 6, 7, 8, 9, 10, 12]
    [1, 2, 4, 5, 6, 7, 8, 9, 11, 12]
    [0, 2, 3, 5, 6, 7, 8, 9, 10, 12]
    [0, 2, 3, 5, 6, 7, 8, 9, 10, 12]
    [0, 2, 3, 5, 6, 7, 8, 9, 11, 12]
    [1, 2, 4, 5, 6, 7, 8, 9, 10, 12]
    [0, 2, 3, 5, 6, 7, 8, 9, 11, 12]
    [1, 2, 4, 5, 6, 7, 8, 9, 11, 12]
    [1, 2, 4, 5, 6, 7, 8, 9, 10, 12]
    [0, 2, 4, 5, 6, 7, 8, 9, 10, 12]
    

        2
  •  0
  •   crazyGamer    7 年前

    permList = itertools.product(*list_of_lists)
    randomPermList = numpy.random.permutation(list(permList))
    

    这是唯一和随机的,但不是迭代。

        3
  •  0
  •   perigon    7 年前

    meta_seq = [[0, 1], [2], [3, 4], [5, 5], [6], [7], [8], [9], [10, 11], [12]]
    print meta_seq
    iter_count = np.prod([len(set(x)) for x in meta_seq])
    print iter_count
    print
    set_l = set()
    for _ in xrange(iter_count*100):
        choices = tuple([np.random.choice(sub_seq) for sub_seq in meta_seq])
        if not choices in set_l:
            set_l.add(choices)
            print choices
    print
    print len(set_l)
    print