Понятия не имею, что делает ваш код. Это слишком сложно. Вот прямая замена.
import string
from itertools import product
def translate_tuple(tup):
''' Takes a tuple of any length containing 0s or 1s.
Returns a new tuple with the correct letters. '''
return tuple(l if tup[i] == 0 else '_' for i, l in enumerate(string.ascii_letters[:len(tup)]))
def get_pairs(length):
''' Get all pairs of binary and translated text. '''
for binary_tup in product((0, 1,), repeat=length):
yield ' '.join(map(str, binary_tup)), ' '.join(translate_tuple(binary_tup))
for b, t in get_pairs(3):
print(f'{b} = {t}')
Который печатает:
0 0 0 = a b c
0 0 1 = a b _
0 1 0 = a _ c
0 1 1 = a _ _
1 0 0 = _ b c
1 0 1 = _ b _
1 1 0 = _ _ c
1 1 1 = _ _ _
Вы можете использовать двоичные числа произвольного размера, задав различную длину для get_pairs()
In [36]: for i in range(10):
...: b, t = next(g)
...: print(f'{b} = {t}')
...:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = a b c d e f g h i j k l m n o p q r s t
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 = a b c d e f g h i j k l m n o p q r s _
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 = a b c d e f g h i j k l m n o p q r _ t
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 = a b c d e f g h i j k l m n o p q r _ _
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 = a b c d e f g h i j k l m n o p q _ s t
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 = a b c d e f g h i j k l m n o p q _ s _
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 = a b c d e f g h i j k l m n o p q _ _ t
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 = a b c d e f g h i j k l m n o p q _ _ _
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 = a b c d e f g h i j k l m n o p _ r s t
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 = a b c d e f g h i j k l m n o p _ r s _
Пояснение
Самый важный бит - translate_tuple()
, но вы можете использовать itertools.product
, чтобы получить все входные кортежи.
translate_tuple(tup)
ожидает двоичный кортеж любой длины, например:
(0, 0, 0)
(0, 1, 0)
(1, 1, 1, 1)
(0, 1, 0, 1, 0)
и возвращает новый кортеж в формате, который вы описали:
(0, 0, 0) => ('a', 'b', 'c')
(0, 1, 0) => ('a', '_', 'c')
(1, 1, 1, 1) => ('_', '_', '_', '_')
(0, 1, 0, 1, 0) => ('a', '_', 'c', '_', 'e')
Следующий Функция get_pairs()
просто генерирует все двоичные кортежи заданной длины, а затем возвращает строку двоичного кортежа и строку результата, объединенную пробелами.
Затем вы можете распечатать строки. Вероятно, было бы лучше получить исходные кортежи и создать строки непосредственно перед печатью, но я хотел оставить это в основном в этой функции.