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

2024-09-26 22:49:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 字符串importnumberforstringdef字母code
3条回答

当然,即使在最后一次迭代中,您也在添加破折号。你知道吗

无论如何,最具python风格的方法是:嵌套2str.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

内部压缩生成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)])

迭代器会被使用,除非是时候发出破折号了。你知道吗

另一种选择,只有一个循环:

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'

if语句中的第二个条件没有任何意义。如果您在最后一次迭代中,您应该修改它,这样就不会添加-

if (i - 3) % 4 == 0 and i < 15:
    ...

做出这样的改变给了我:

LjIs-6HT5-zZMD-HMMz

我是否可以建议您对当前使用^{}的方法进行改进?你知道吗

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.sample,但只能从python3.6开始。你知道吗

相关问题 更多 >

    热门问题