从随机生成的密钥中删除尾随破折号

时间:2017-08-27 20:07:30

标签: python random conditional-statements

因此,使用生成数字/字母字符串时的代码,它会在末尾生成一个额外的破折号,我希望它只包含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 -

4 个答案:

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