Добавление строк вместе добавляет скобки и кавычки

Я новичок в программировании и пытаюсь изучить его, выполняя небольшие проекты. В настоящее время я работаю над генератором случайных строк, и у меня это сделано на 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"

Как вы можете видеть в первом коде, я пробовал несколько вещей, потому что мне казалось, что я каким-то образом создавал список со списками в качестве элементов, каждый из которых имеет 1 запись. Итак, я бы просто распечатал каждый элемент, но результат был (для пользовательского ввода/длины 10):

['e']['3']

Таким образом, он просто распечатал каждый символ в этом списке в виде строки (включая скобки и кавычки), которую я интерпретирую как все, что я создал, не являющееся списком. но на самом деле все еще строка

Проведя небольшое исследование и предполагая, что я все еще создал строку, я нашел это из W3Schools. Если я правильно понимаю, я делаю все правильно, пытаясь сложить строки вместе.

Не могли бы вы рассказать мне, что здесь происходит, в частности, почему я получаю вывод, который выглядит как список списков? И если вы можете уделить еще немного времени, я также хотел бы услышать о лучшем способе сделать это, но я в основном хочу понять, что происходит, а не получить решение. Я хотел бы найти решение самостоятельно. :D

Ваше здоровье

PS: На всякий случай, если вам интересно: я пытаюсь учиться на практике и в настоящее время следую мини-проектам, предложенным ЗДЕСЬ. Но в этом случае я читал в W3Schools, что метод «объединения» приводит к хронологическим результатам, поэтому я добавил дополнительное усложнение, сделав его действительно случайным.

«Но в этом случае я читал в W3Schools, что метод «объединения» приводит к хронологическим результатам» Это не должно происходить. Когда вы делаете "".join(random.sample(letters, length)), функция random.sample() выбирает length случайных элементов letters. str.join() просто присоединяется эти буквы в одну строку. Функционально нет никакой разницы между этим и выполнением того, что вы делаете (в цикле, если вы сделали это правильно)
Pranav Hosangadi 16.03.2022 16:04

Вы получаете результат, который вы делаете сейчас, потому что random.sample() возвращает список, содержащий length строк. Когда вы делаете str() в списке, он возвращает строку со скобками и кавычками, потому что это как представлен список строк.

Pranav Hosangadi 16.03.2022 16:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
21
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Итак, проблема в том, что random.choice возвращает список строк вместо строки, как вы можете видеть ниже:

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

Что на самом деле произошло, так это добавление строк, содержащих результат приведения списка (например, ['H'] было преобразовано в "['H']", а затем напечатано на экране как ['H']).

После изменения функции на random.choice она работала нормально:

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

Переключите этот random.sample на random.choice в своей функции, и все будет так, как вы ожидали.

Большое спасибо, это решило это: D

asdfmoin 18.03.2022 21:51

И теперь я понял это... так что еще раз спасибо! хД

asdfmoin 19.03.2022 11:31

Функция random.sample() возвращает список, выбранный из заданной строки. Вот почему вы получаете кучу списков, сложенных вместе.

Другие вопросы по теме