Комбинации в списках списков - PullRequest
2 голосов
/ 09 октября 2019

Имея следующий список списков ['boundari', 'special', ['forest', 'arb'], 'abod'], я хотел бы получить следующую комбинацию:

[['boundari', 'special', 'forest', 'abod'], ['boundari', 'special', 'arb', 'abod']]

Ближайшее решение, использующее следующий продукт при удалении последнего элемента abod (который янужно сохранить):

print([list(p) for p in product([toks[:2]], *toks[2:])])

[[['boundari', 'special'], 'forest'], [['boundari', 'special'], 'arb']]

Однако я не получил правильную комбинацию:

 [['boundari', 'special', 'forest', 'abod'], ['boundari', 'special', 'arb', 'abod']]

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Вы можете сделать что-то вроде этого:

arr = ['boundari', 'special', ['forest', 'arb'], 'abod']


def get_combinations(arr):
    n = len(arr)

    def _get_combinations(so_far, idx):
        if idx >= n:
            yield so_far[:]
            return

        if isinstance(arr[idx], list):
            for val in arr[idx]:
                so_far.append(val)
                yield from _get_combinations(so_far, idx + 1)
                so_far.pop()
        else:
            so_far.append(arr[idx])
            yield from _get_combinations(so_far, idx + 1)
            so_far.pop()

    yield from _get_combinations([], 0)


expected_ans = [
    ['boundari', 'special', 'forest', 'abod'], 
    ['boundari', 'special', 'arb', 'abod'],
]
assert list(get_combinations(arr)) == expected_ans
1 голос
/ 09 октября 2019

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

my_list_of_list = ['boundari', 'special', ['forest', 'arb'], 'abod']
indecies_of_lists = []
base_list = []
lists_of_lists = []

output = []
for item in my_list_of_list:
    if type(item) == list:
        lists_of_lists.append(item)
    else:
        base_list.append(item)

for item in lists_of_lists:
    for sub_item in item:
        new_list = list(base_list)
        new_list.append(sub_item)
        output.append(new_list)
print(output)

вывод будет [['boundari', 'special', 'abod', 'forest'], ['boundari', 'special', 'abod', 'arb']]

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