Попытка перечислить / перебрать алфавит, числа и т. Д. С помощью Python 2 - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь перебрать алфавит, чтобы он напечатал '0, 1, 2, 3' и 'a, b, c' и '!'и так далее.После того, как все персонажи будут циклически пройдены, я хочу, чтобы они стали «aa», «ab», «a0» и так далее.Это рабочий код, который у меня есть:

alph = {
    0: '0',
    1: '1',
    2: '2',
    3: '3',
    4: '4',
    5: '5',
    6: '6',
    7: '7',
    8: '8',
    9: '9',
    10: 'a',
    11: 'b',
    12: 'c',
    13: 'd',
    14: 'e',
    15: 'f',
    16: 'g',
    17: 'h',
    18: 'i',
    19: 'j',
    20: 'l',
    21: 'm',
    22: 'n',
    23: 'o',
    24: 'p',
    25: 'q',
    26: 'r',
    27: 's',
    28: 't',
    29: 'u',
    30: 'v',
    31: 'w',
    32: 'x',
    33: 'y',
    34: 'z',
    35: '!'
}


def one(sweet):
    print sweet

def yeah():
    i = 0
    while 1==1:
        if divmod(i,36)[0] == 0:
            a = alph[divmod(i, 36)[1]]
            sweet = a
            one(sweet)
            i += 1

        elif divmod(i,36)[0] < 36:
            b = alph[divmod(i, 36)[1]]
            a = alph[divmod(i, 36)[0]]
            sweet = a + b
            one(sweet)
            i += 1

    return false

yeah()

Эта часть прекрасно работает!он напечатает «а» через «!!».Часть, которую я изо всех сил пытаюсь обернуть вокруг себя, это третья часть:

        elif divmod(i,36)[0] < 36**2:
            c = alph[divmod(i, 36)[1]]
            b = alph[divmod((i//36), 36)[0]]
            a = alph[divmod(i, 36)[0]]
            sweet = a + b + c
            one(sweet)
            i += 1

Это должно напечатать 'aaa' 'aab' и так далее.Я не уверен, как идти об этом.После этогоЯ также понял, что мне придется создавать бесконечное количество операторов «elif», одно для «aaaa», другое для «aaaaa» и т. Д. Каков наилучший способ создания функции, которая потенциально может перейти в бесконечность?

1 Ответ

0 голосов
/ 30 сентября 2018

Нет необходимости использовать dict для хранения базовых цифр, мы можем просто поместить их в строку:

alph = '0123456789abcdefghijlmnopqrstuvwxyz!'

Мы можем получить правильные цифры, выполнив деление с остатком в цикле.Если входное число равно нулю, цикл не будет выдавать никаких цифр, поэтому мы рассматриваем это как особый случай.Этот код будет работать со строкой base_digits любой длины, но я просто буду использовать короткую строку, чтобы вывод был коротким.Этот код работает правильно на Python 2 и Python 3.

from __future__ import print_function

def int_to_base(n, base_digits):
    if n == 0:
        return base_digits[0]
    base = len(base_digits)
    digits = []
    # Build a list of digits in reverse order
    while n:
        n, r = divmod(n, base)
        digits.append(base_digits[r])
    # Reverse the digits and join them into a string
    return ''.join(digits[::-1])

base_digits = '0ab'
for i in range(28):
    print(i, int_to_base(i, base_digits))

output

0 0
1 a
2 b
3 a0
4 aa
5 ab
6 b0
7 ba
8 bb
9 a00
10 a0a
11 a0b
12 aa0
13 aaa
14 aab
15 ab0
16 aba
17 abb
18 b00
19 b0a
20 b0b
21 ba0
22 baa
23 bab
24 bb0
25 bba
26 bbb
27 a000

Еще один способ сделать это - создать генератор, которыйсчитает с использованием базовых цифр.Вы можете зациклить генератор в цикле for или получить его следующее значение, используя функцию next.

def base_counter(base_digits):
    """ An infinite iterator that counts using base_digits as its digits """
    base = len(base_digits)
    digits = [0]
    while True:
        yield ''.join([base_digits[d] for d in reversed(digits)])
        digits[0] += 1
        pos = 0
        while digits[pos] == base:
            digits[pos] = 0
            pos += 1
            if pos == len(digits):
                digits.append(1)
            else:
                digits[pos] += 1

base_digits = '0ab'
counter = base_counter(base_digits)
for i, v in enumerate(counter):
    print(i, v)
    if i == 27:
        break
print('next', next(counter))

Это выдаст тот же вывод, что и в предыдущей версии, и затем напечатает

next a00a
...