У меня есть вложенный список g=[[2, 1],[1, 3],[8, 1]]. Я хочу иметь список, в котором:

Каждый внутренний элемент списка складывается максимум с двумя другими внутренними элементами. Вот процесс и, следовательно, желаемый результат:

# 1= a single element like g[0][1]
# 2= a single element like g[0][0] or can be added by two inner elements like g[0][1]+g[1][0]
# 3= a single g[1][1], adding two elements g[0][0]+g[1][0] or at most three g[0][1]+g[1][0]+g[2][1] 
.
.
.
# 13= g[0][0]+g[1][1]+g[2][0]

Итак, окончательным результатом будет список. Обратите внимание, что в результатах не может быть 7, так как нет комбинации (без замены), которая могла бы быть суммирована до 7. Также из каждого элемента может быть выбрано не более одного внутреннего значения.

expected_result = [1,2,3,4,5,6,8,9,10,11,12,13]

Это то, что я сделал, но он не содержит 1 и 2, а также содержит 7:

g=[[2, 1],[1, 3],[8, 1]]
from itertools import product
maxx = []
# Getting all possible combination of adding at most 3 elements (=length of g)
for i in list((product([i for j in g for i in j], repeat=len(g)))):
    maxx.append(sum(i))
    # Narrowing the result so it doesn't exceed the maximum combination which is sum([2,3,8])
print([i for i in set(maxx) if i<=sum(max_list)])

>>> [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

Любая помощь приветствуется.

0
Saeed 4 Май 2021 в 00:36

2 ответа

Лучший ответ

Кажется, что форма / формат данных - отвлекающий маневр. Просто сгладьте список и найдите уникальные суммы каждой комбинации 1, 2 или 3 элементов сглаженного списка. Используйте itertools.chain, чтобы сгладить список, itertools.combinations, чтобы создать комбинации, itertools.chain снова, чтобы объединить комбинации, и set, чтобы получить уникальные результаты:

>>> import itertools
>>> g = [[2, 1],[1, 3],[8, 1]]
>>> flattened = itertools.chain(*g)
>>> flattened
[2, 1, 1, 3, 8, 1]
>>> list(set(map(sum,
  itertools.chain(itertools.combinations(flattened, 1), 
                  itertools.combinations(flattened, 2),
                  itertools.combinations(flattened, 3)))))
[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13]

Изменить : вопрос был изменен, чтобы включить следующее ограничение:

Также из каждого элемента можно выбрать не более одного внутреннего значения.

Это означает, что вы не можете сгладить список. Вот обновленное решение, удовлетворяющее новому ограничению:

>>> list(set(map(sum,
        itertools.chain.from_iterable(itertools.combinations(p, n)
        for n in range(1,4)
        for p in itertools.product(*g)))))
[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13]

>>> g = [[2, 1],[1, 3],[8, 1],[14, 15]  # should not produce 29 as an answer
>>> list(set(map(sum,
        itertools.chain.from_iterable(itertools.combinations(p, n)
        for n in range(1,4)
        for p in itertools.product(*g)))))
[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26]
1
Woodford 3 Май 2021 в 22:34

Самая простая реализация, о которой я могу думать сейчас:

def fun(numbers):
    all_numbers = [x for y in numbers for x in y]
    output = list(set(all_numbers))
    for x in all_numbers:
        for y in all_numbers:
            if x is not y:
                output.append(x + y)
            for z in all_numbers:
                if y is not x and y is not z and x is not z:
                    output.append(x + y + z)
    return list(set(output))


print(fun([[2, 1], [1, 3], [8, 1]]))

Выше кода печатает

[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13]
0
Marcin-99 3 Май 2021 в 21:56