Объединить элементы кортежа как строку, где один элемент является строкой, а другой - кортежем целых чисел - PullRequest
0 голосов
/ 04 октября 2018

запрос:

Напишите программу на Python, которая предлагает пользователю ввести его или ее имя, а затем создает секретный пароль, состоящий из трех букв (в нижнем регистре), случайно выбранных из его или ее имени,и случайное четырехзначное число.Например, если пользователь вводит «Vassilis Bouras», секретный пароль может быть одним из «sar1359» или «vbs7281» или «bor1459».Пробелы не допускаются в секретном пароле.Вам придется использовать конкатенацию нарезки строк, случайного, нижнего и 446670.

мой код:

import random

name = input("Enter your name all lowercase ")

name2 = name.replace(" ", "")

letter1 = random.choice(name2)
letter2 = random.choice(name2)
letter3 = random.choice(name2)
letter4 = random.choice(name2)

passwordnumber = (random.randint(0, 9),
                  random.randint(0, 9),
                  random.randint(0, 9),
                  random.randint(0, 9))

passwordletter = (letter1 + letter2 + letter3 + letter4)

password = passwordletter, passwordnumber

print(password)

Теперь я ввел имя "ник g" в программу и получил:

('nigc', (5, 4, 9, 6))

Что меня интересует, так это то, как я могу сделать так, чтобы выходные данные складывались из цифр, не разбирая их так, как это, иставить скобки.любая помощь очень ценится, спасибо!

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

Это все идет в правильном направлении, просто некоторая путаница вокруг строк и кортежей, чтобы прояснить ситуацию.Причина, по которой в ответе заключены квадратные скобки, заключается в том, что

(random.randint(0, 9),
 random.randint(0, 9),
 random.randint(0, 9),
 random.randint(0, 9))

(числа, разделенные запятыми, в круглых скобках) и

passwordletter, passwordnumber

являются кортежами.В итоге вы получили 4-кортеж (цифры) внутри 2-кортежа.Python заключает в скобки их, чтобы вы знали:

('nigc', (5, 4, 9, 6))

означает 2-кортеж со строкой на первом месте и встроенный 4-кортеж на втором месте.

Что нужноЧтобы произойти сейчас, нужно:

  1. соединить 4-кортеж вместе, чтобы создать строку
  2. добавить строки друг к другу, чтобы получить полный пароль

Прежде чем объединять числа в строку, вам необходимо преобразовать сами числа в строки, иначе вы получите TypeError при попытке добавить целые числа в строки.str(5) создает строку '5', поэтому давайте используем str() для каждого из ваших чисел:

passwordnumber = (str(random.randint(0, 9)),
                  str(random.randint(0, 9)),
                  str(random.randint(0, 9)),
                  str(random.randint(0, 9)))

Но это становится повторяющимся и сложным для чтения.А что, если безопасность станет более жесткой, и вы захотите 12-значный пароль?В Python есть полезное средство, называемое списком, которое отлично подходит для создания списков любого размера.Мы можем использовать один для построения списка чисел без повторения кода:

numbers_list = [str(randint(0, 9)) for _ in range(4)]

Вот полный ответ, намного короче вашего, с использованием пониманий и нескольких других полезных кусочков Python.Обратите внимание на использование str() для преобразования чисел в строки перед объединением, как упоминалось выше.

from random import choice, randint

name = 'Sherlock Holmes'
name_as_word_list = name.lower().split()
name_no_spaces = ''.join(name_as_word_list)

letters_list = [choice(name_no_spaces) for _ in range(3)]
numbers_list = [str(randint(0, 9)) for _ in range(4)]
password = ''.join(letters_list + numbers_list)
print(password)
0 голосов
/ 04 октября 2018

Я думаю, вы можете упростить свой код и использовать формат строки для форматирования ваших паролей.Например:

import random

name = "Guido van Rossum"

name2 = name.replace(" ", "")

letter1 = random.choice(name2)
letter2 = random.choice(name2)
letter3 = random.choice(name2)
letter4 = random.choice(name2)

num1 = random.randint(0, 9)
num2 = random.randint(0, 9)
num3 = random.randint(0, 9)
num4 = random.randint(0, 9)

print(f"{letter1}{letter2}{letter3}{letter4}{num1}{num2}{num3}{num4}")
0 голосов
/ 04 октября 2018

Вы можете использовать форматированную печать и распаковать passwordnumber кортеж

print('{}{}{}{}{}'.format(passwordletter, *passwordnumber)
# nigc5496
0 голосов
/ 04 октября 2018

Вы можете преобразовать числа в строки, сложить их в одну строку с join, а затем объединить с буквами:

password = ('nigc', (5, 4, 9, 6))

password[0] + ''.join([str(x) for x in password[1]])
# 'nigc5496'
...