【问题标题】:Enumeration of balls in basket with a specific order以特定顺序枚举篮子中的球
【发布时间】:2017-01-04 02:39:04
【问题描述】:

我想按特定顺序列举解决方案。目前,使用以下代码:

def balls_in_baskets(balls=1, baskets=1):
    if baskets == 1:
        yield [balls]
    elif balls == 0:
        yield [0]*baskets
    else:
        for i in range(balls+1):
            for j in balls_in_baskets(balls-i, 1):
                for k in balls_in_baskets(i, baskets-1):
                    yield j+k

x=[t for t in balls_in_baskets(3,3)][::-1]
for i in x:
    print(i)

我明白了:

[0, 0, 3]
[0, 1, 2]
[0, 2, 1]
[0, 3, 0]
[1, 0, 2]
[1, 1, 1]
[1, 2, 0]
[2, 0, 1]
[2, 1, 0]
[3, 0, 0]

但是,我想要这个订单:

[0, 0, 3]
[0, 1, 2]
[1, 0, 2]
[0, 2, 1]
[1, 1, 1]
[2, 0, 1]
[0, 3, 0]
[1, 2, 0]
[2, 1, 0]
[3, 0, 0]

我怎样才能达到这个正确的顺序?

【问题讨论】:

    标签: python python-3.x combinations combinatorics


    【解决方案1】:

    通过在列表理解中使用生成器,您已经失去了生成器的内存效率,因此您还可以sort 结果:

    x = sorted(balls_in_baskets(3,3), key=lambda x: x[::-1], reverse=True)
    

    然后打印预期的输出:

    [0, 0, 3]
    [0, 1, 2]
    [1, 0, 2]
    [0, 2, 1]
    [1, 1, 1]
    [2, 0, 1]
    [0, 3, 0]
    [1, 2, 0]
    [2, 1, 0]
    [3, 0, 0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多