尝试 enumerate/cycle 通过字母表、数字等 python 2
Trying to enumerate/cycle through the alphabet, numbers, and etc with python 2
我正在尝试循环遍历字母表,以便打印“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' 等等。创建一个函数的最佳方法是什么有可能达到无穷大吗?
不需要用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))
输出
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
我正在尝试循环遍历字母表,以便打印“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' 等等。创建一个函数的最佳方法是什么有可能达到无穷大吗?
不需要用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))
输出
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