Создайте список, который содержит все подмножества из верхней границы (но где lst [i] ≤ верхней границы [i]) - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь построить функцию, которая:

  • принимает в качестве аргумента список натуральных чисел длины n, а
  • возвращает список всех списков длины nсостоящий из неотрицательных целых чисел со следующим свойством:
    • для списка lst он содержит, что для всех индексов i, lst[i] ≤ upper bound[i]

ДляНапример, если список ввода был [1, 1, 2], то вывод был бы

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

Вот как далеко я получил:

def bounded_list(ub):
    f = len(ub) * [0]
    l = ub
    res = [f]

    while res[-1] != l:
        res += [lex_suc1(res[-1], ub)]

    return res


def lex_suc1(lst, ub):
    res = lst[:]

    i = len(res) - 1
    while res[i] == ub[i]:
        res[i] = 0
        i -= 1

    res[i] = ub[i]
    return res

, который дает вывод:

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

Я не могу понять, как включить недостающие списки, любая помощь будет полезна.

Ответы [ 3 ]

3 голосов
/ 30 апреля 2019

это опция:

from itertools import product

for lst in product(range(2), range(2), range(3)):
    print(lst)

обратите внимание, что ваш список [1, 1, 2] здесь переводится как range(2), range(2), range(3).

или более непосредственно:

res = list(product(range(2), range(2), range(3)))
# [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), 
#  (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2)]

или даже:

lst = [1, 1, 2]
res = list(product(*(range(i+1) for i in lst)))
2 голосов
/ 30 апреля 2019

Вам следует взглянуть на пакет itertools и список понимания .

Тогда решение будет:

def f(upper_bounds):
    return list(itertools.product(*(range(ub+1) for ub in upper_bounds)))
0 голосов
/ 30 апреля 2019

Для этого вы можете использовать itertools.product .

from  itertools import product
li = [1, 1, 2]

#Generate a list of possible numbers to generate the output from the given list
iters = [list(range(item+1)) for item in li]
#[[0, 1], [0, 1], [0, 1, 2]]

#Generate all possible combinations of these lists
print(list(product(*iters)))

В этом случае будет вывод.

[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), 
(0, 1, 1), (0, 1, 2), (1, 0, 0), (1, 0, 1), 
(1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...