gpt4 book ai didi

python - 在 Python 中流式传输嵌套列表(列表列表)中元素的所有无序/随机排列的唯一排列?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:13:12 25 4
gpt4 key购买 nike

我有如下两级嵌套列表。

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

我想生成这个嵌套列表的所有 8 个唯一排列,但我的应用程序绝对需要输出是(伪)随机和无序的。通常,排列策略按顺序产生排列,但我希望能够无序地产生所有排列。

此外,这必须通过一些生成器完成,因为嵌套列表可能很长,并且唯一排列的数量可能会组合爆炸。

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

(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)

...与以下内容相反,它由 itertools.product(*some_list) 生成:

(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.product 的功能,但会乱序生成排列,也会对我有很大帮助。感谢您的帮助。

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

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

最佳答案

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

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]

但是,正如其他人在评论中指出的那样,除非您以某种方式将 yield 结果缓存在内存中,否则您不能真正保证不会得到重复项。您也不能保证在任何 8 个连续迭代中获得所有 8 个唯一迭代。

关于python - 在 Python 中流式传输嵌套列表(列表列表)中元素的所有无序/随机排列的唯一排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45497405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com