【问题标题】:Is there any way to generate list exponentially in Python?有没有办法在 Python 中以指数方式生成列表?
【发布时间】:2017-02-12 18:18:10
【问题描述】:

我有一本字典:

D = {1:[1,2,3], 2:[4,5], 3: [6,7]}

我想做的是找到所有 3*2*2 的组合,

 [[1,4,6], [1,4,7],
 [1,5,6], [1,5,7],
 [2,4,6], [2,4,6],
 [2,5,6], [2,5,7],
 [3,4,6], [3,4,7],
 [3,5,6], [3,5,7] ]

有什么办法,就做循环之类的

for key in D:
   for num in D[key]:
     for xxxxx

然后进行全部组合?谢谢!

【问题讨论】:

    标签: python list hashtable


    【解决方案1】:

    使用itertools.product:

    itertools.product(*D.values())
    

    例子:

    >>> import itertools
    >>> D = {1:[1,2,3], 2:[4,5], 3: [6,7]}
    >>> list(itertools.product(*D.values()))
    [(1, 4, 6), (1, 4, 7), (1, 5, 6), (1, 5, 7), (2, 4, 6), (2, 4, 7),
     (2, 5, 6), (2, 5, 7), (3, 4, 6), (3, 4, 7), (3, 5, 6), (3, 5, 7)]
    

    【讨论】:

    • 这是一个很好的答案。但我实际上可能需要知道循环结构。例如,现在考虑D={1: {2}, 2: {1, 3}, 3: {2, 4}, 4: {3}}。请注意,在每个元素中,我不允许重复数字。例如不允许使用 (2,1,3,3),因此 D 中唯一可能的组合是 (2,1,4,3)。这可以避免内存中的指数使用。有没有其他方法可以做到这一点?
    • @Hsiang 您可以像这样过滤重复:[c for c in itertools.product(*D.values()) if len(c) == len(set(c))]
    • @Hsiang orlp 评论中的解决方案避免了过多的内存使用,但它并没有避免过多的运行时间,因为它不会尽早修剪树。例如对于{1: [0,1], 2: [0], 3: range(1000), 4: range(1000)},它将迭代超过一百万个从两个零开始的元组,尽管我们知道它们都不是有效的。根据数据的性质,您最好递归地实现它并修剪所有已经有重复的分支。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2015-08-19
    • 1970-01-01
    • 2015-05-05
    • 2013-04-24
    • 2012-03-27
    • 2021-07-17
    相关资源
    最近更新 更多