выведите все варианты 1 и 0 в двоичной последовательности с отсутствующими местами

#python #python-3.x

Вопрос:

У меня есть следующая последовательность с отсутствующими 1 и 0:

 "01010xx101xxx001"
 

И мне нужно напечатать все возможные последовательности вместо отсутствующих мест, отмеченных "x"

Как я могу это сделать, если мне также может потребоваться изменить число "x" s?

Комментарии:

1. Вы могли бы начать с вопроса о том, сколько линий или комбинаций вам нужно будет создать? Это дается 5 x, каждый из которых равен 0 или 1.

2. Конечно, в моем примере это 2^5, поэтому мне нужно сначала передать строку, чтобы получить число x «s», а затем цикл с 2^x , но после этого я не смог заставить ее работать

Ответ №1:

Вы можете сделать следующее, используя itertools.product :

 from itertools import product

def combs(string):
    for p in map(iter, product("01", repeat=string.count("x"))):
        yield "".join(c if c in "01" else next(p) for c in string)

        # maybe more consistent:
        # yield "".join(next(p) if c == "x" else c for c in string)

        # or shortest, with some operator trickery
        # yield "".join(c!="x" and c or next(p) for c in string)

for c in combs("01010xx101xxx001"):
    print(c)

0101000101000001
0101000101001001
0101000101010001
0101000101011001
0101000101100001
0101000101101001
# ...
 

Некоторая документация по используемым здесь utils:

Комментарии:

1. Я поддерживаю это — красиво. Я новичок в Python, никогда itertools раньше его не видел. Это работает, спасибо!

2. Спасибо за комплименты 🙂 знание инструментария позволяет вам немного поэтически выразиться на Python.

3. Я тоже пытался решить эту проблему, но я боролся с заполнением x s, используя вывод кортежа из product . Преобразование кортежа в итератор — это так умно. Я охвачен благоговейным трепетом.

4. 1 Что чрезвычайно хорошо в этом решении, так это то, что вы можете довольно легко изменить его, например, заменить » x «всеми комбинациями» abc » (или другими подобными случаями).

Ответ №2:

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

 l = '1010xx101xxx001'

# count x's
count = len([c for c in l if c == 'x'])

# There will be 2 ^ {count} combinations, so iterate from 0 to 2 ^ {count} - 1
for i in range(2 ** count):
    # Get the binary representation of i
    b = str(bin(i)).replace('0b', '')

    # Pad with zero's so we get {count} digits ('1' becomes '00001')
    b_p = '0' * (count - len(b))   b

    # Replace x's one at a time
    out = l
    for digit in b_p:
        out = out.replace('x', digit, 1)
    print(out)