尝试使用python 2枚举/循环遍历字母,数字等

时间:2018-09-26 01:37:46

标签: python python-2.7 if-statement enumeration

我正在尝试循环浏览字母,以便它将打印“ 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()

这部分效果很好!它将打印出“ a”至“ !!”。我努力挣扎的部分是第三部分:

        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 :(得分:2)

不需要使用字典来保存基数,我们可以将它们放入字符串中:

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

输出

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