Как я могу решить эту проблему, используя itertools? - PullRequest
0 голосов
/ 07 октября 2019

Здравствуйте, я пытался использовать этот инструмент:

list(combinations('01', 3))

, но я получаю этот результат:

[]

Я хотел бы получить эти результаты:

000
001
011
111
101
100
010

Отдельно я хотел бы также иметь разные случаи. Например,

, учитывая 111 Я ожидаю этих результатов:

111
12
21
3

Возможно ли сделать эти две вещи, используя itertools?

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Вы, кажется, задаете два отдельных вопроса. На основании ваших результатов:

  1. 000 001 011 111 101 100 010

Использование permutations_with_replacement комбинаторный через itertools.product.

111 12 21 3

Использование разбиений алгоритм через more_itertools.partitions.

Дано

import itertools as it

import more_itertools as mit

Код

# 1 - Permutation w Replacement
>>> list(it.product("01", repeat=3))
[('0', '0', '0'),
 ('0', '0', '1'),
 ('0', '1', '0'),
 ('0', '1', '1'),
 ('1', '0', '0'),
 ('1', '0', '1'),
 ('1', '1', '0'),
 ('1', '1', '1')]

# 2 - Partitions
>>> list(mit.partitions("111"))
[[['1', '1', '1']],
 [['1'], ['1', '1']],
 [['1', '1'], ['1']],
 [['1'], ['1'], ['1']]]

Подробности

Для достижения конкретных результатов используйте списочные выражения:

# 1
>>> ["".join(x) for x in it.product("01", repeat=3)]

['000', '001', '010', '011', '100', '101', '110', '111']

# 2
>>> [[sum(map(int, x)) for x in sub] for sub in mit.partitions("111")]

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

more_itertools - сторонний пакет. Установить с > pip install more-itertools.

0 голосов
/ 07 октября 2019

Вот решение, которое частично использует решение в этом ответе .

  • Функция разделения из ответа alexis (см. Ссылку) возвращает список, разбитый на группы (т.е. [[[1,1,1]], [[1,1], [1]], [[1], [1,1]], [[1], [1], [1]]]
  • Чтобы получить числа в вашем вопросе, я добавил часть, в которой хранится только сумма каждого внутреннего списка
  • list (dict.fromkeys (...)) используется для удаления дубликатов

Код

def partition(collection):
    if len(collection) == 1:
        yield [ collection ]
        return

    first = collection[0]
    for smaller in partition(collection[1:]):
        # insert `first` in each of the subpartition's subsets
        for n, subset in enumerate(smaller):
            yield smaller[:n] + [[ first ] + subset]  + smaller[n+1:]
        # put `first` in its own subset 
        yield [ [ first ] ] + smaller


elements = list([1,1,1])

lst = list(dict.fromkeys([ tuple([sum(p[1][i]) for i in range(len(p[1]))]) for p in enumerate(partition(elements), 1) ]))

print(sorted(lst))

Выход:

[(1, 1, 1), (1, 2), (2, 1), (3,)]
...