#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)