因此,使用生成数字/字母字符串时的代码,它会在末尾生成一个额外的破折号,我希望它只包含16位数字和字母(没有额外的破折号)
import string, random
def generateCode():
code = ''
for i in xrange(16):
number = random.choice(string.ascii_letters + string.digits)
code += str(number)
if (i - 3) % 4 == 0 and i - 4:
code += '-'
file = open('AlphaKeys.txt', 'w')
file.write(code + '\n')
file.close()
return code
generateCode()
输出示例:qIss-wXbS-PZo7-audg -
答案 0 :(得分:0)
if
语句中的第二个条件没有任何意义。您应该修改它,以便在最后一次迭代时不添加-
:
if (i - 3) % 4 == 0 and i < 15:
...
进行此更改会给我:
LjIs-6HT5-zZMD-HMMz
我可以建议使用random.sample
改进您当前的方法吗?
import random
r = string.ascii_letters + string.digits
string = '-'.join(''.join(random.sample(r, 4)) for _ in range(4))
print(string)
'fiqc-fvbc-z7s9-62w3'
请注意,random.sample
不会为每次通话提供替换,因此如果您需要,则需要random.choice
。
如果你想要替换随机性,你可以用random.choices
代替random.sample
- 但只能从python3.6及以后代替。
答案 1 :(得分:0)
当然,即使在最后一次迭代中,您也会添加破折号。
无论如何,最pythonic方式:只嵌套2 str.join
语句:
import string,random
code = "-".join(["".join([random.choice(string.ascii_letters + string.digits) for _ in range(4)]) for _ in range(4)])
print(code)
一个例子:
m7b1-A0vS-JARQ-hlo2
内部comprension生成4个字母/数字序列,外部序列使用-
连接其中4个序列。
请注意,join([..])
语法可能看起来很麻烦,但比没有方括号(Joining strings. Generator or list comprehension?)
编辑:请注意,您的数字/字母可以与random.choice
重复。没有重复的更好方法是使用random.choice
,如下所示:
import string,random
it = iter(random.sample(string.ascii_letters + string.digits,16))
code = "".join(["-" if i % 5 == 4 else next(it) for i in range(19)])
除非是时候发布破折号,否则消耗迭代器。
答案 2 :(得分:0)
另一种选择,只有一个循环:
import string,random
possible_chars = string.ascii_letters + string.digits
"".join(random.choice(possible_chars) if i % 5 < 4 else '-' for i in range(19))
#=> '4Mhg-flw1-lUEu-pu3h'
答案 3 :(得分:0)
另一种方法是在添加数字之前添加添加破折号的代码。例如
if i and i % 4 == 0:
code+= '-'
number = random.choice(string.ascii_letters + string.digits)
code += str(number)
比使用
之后的操作更具可读性 if (i - 3) % 4 == 0 and i < 15: code+= '-'
但一般来说,使用连接将是更加pythonic的方式,例如。
def code_part():
return ''.join(random.choice(string.ascii_letters + string.digits)
for i in xrange(4))
'-'.join(code_part() for i in xrange(4))