将字符串添加在一起会添加方括号和引号



我是编程新手,尝试通过做小项目来学习编程。目前我正在开发一个随机字符串生成器,我已经完成了99%,但我无法获得我想要的输出。

首先,这里是代码:

import random
def pwgenerator():
print("This is a randomm password generator.")
print("Enter the lenght of your password and press enter to generate a password.")
lenght = int(input())
template = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!" # this is the sample used for choosing random characters
generator = ""
for x in range(lenght): # join fcuntion goes trough str chronologically and I want it fully randomized, so I made this loop
add_on = str(random.sample(template, 1))
generator = generator + add_on
#print(add_on) added this and next one to test if  these are already like list or still strings.
#print(generator)
print(generator) # I wanted this to work,  but...
for x in range(lenght): #...created this,  because I thought that  I created list with "generator" and tried to print out a normal string with this
print(generator[x], end="")
pwgenerator()

最初的代码应该是这样的:

import random

def pwgenerator():
print("This is a randomm password generator.")
print("Enter the lenght of your password and press enter to generate a password.")
lenght = int(input())
template = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!"
generator = ""
for x in range(lenght):
generator = generator + str(random.sample(template, 1))
print(generator)
pwgenerator()

问题是,使用这个原始代码,例如输入10,我会得到这样的结果:

['e']['3']['i']['E']['L']['I']['3']['r']['l']['2']

作为这里的输出,我想要的是";e3iELI3rl2";

正如你在第一段代码中看到的那样,我尝试了一些事情,因为在我看来,我是在以某种方式创建一个列表,每个列表都有一个条目。所以我想我只会打印出每一项,但结果是(对于用户输入/长度为10(:

['e']['3']

所以它只是把列表中的每个字符打印成一个字符串(包括括号和引号(,我把它解释为我创建的任何东西都不是列表。但实际上仍然是一个字符串

做了一些研究——假设我仍然创建了一个字符串——我从W3Schools找到了这个。如果我理解得正确的话,我会把所有的事情都做好,试着把字符串加在一起。

你能告诉我这里发生了什么吗,特别是为什么我得到的输出看起来像一个列表列表?如果你能抽出更多的时间,我也想听听更好的方法,但我主要想了解发生了什么,而不是得到一个解决方案。我想自己找个解决办法D

干杯

PS:万一你想知道:我正在努力边做边学,目前正在关注这里建议的迷你项目。但在这种情况下,我在W3Schools上读到;加入";方法的结果是按时间顺序排列的,所以我增加了使其真正随机的额外复杂性。

好的,所以问题是random.choice返回字符串列表,而不是下面的字符串:

template = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!"
random.sample(template, 1)
Out[5]: ['H']

实际上,它添加了包含列表转换结果的字符串(例如,[‘H’]被转换为"[‘H‘]",然后在屏幕上打印为[‘H"](。

在将函数修改为随机选择后,它运行良好:

random.choice(template)
Out[6]: 'j'

在你的函数中将这个random.sample切换到random.choice,它将如你所期望的那样。

random.sample()函数返回从给定字符串中选择的列表。这就是为什么你会得到一堆列表。

最新更新