2017-01-04 10 views
1

Я бы хотел перечислить решение с определенным заказом. В настоящее время на код ниже:Перечисление мячей в корзине с определенным заказом

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] 

Как я могу добиться этого правильного порядка?

ответ

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]