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

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

    def basewords():
        print("Enter base words here:")
        q = str(input("TIP: Enter your desired words seperated by spaces only.\n> "))
        lst = [string.punctuation, string.digits]
        x = ''.join(random.choice(lst)(c) for c in q)
        q = q.replace(" ", x)
        print(q)

Мне нужны пробелы между словами (например, Hello World Dog House) с рандомизированными символами пунктуации ASCII, чтобы теоретически он мог выглядеть как «Hello! World ^ Dog, House». Тем не менее, в настоящее время я получаю TypeError. Любая помощь очень ценится.

0
MachineLimousine 9 Июл 2019 в 08:02

3 ответа

Лучший ответ

Просто присоединитесь к двум спискам специальных символов, не помещайте их в список для random.choice. Один пример лайнера:

''.join(i if i != ' ' else random.choice(string.punctuation + string.digits)
    for i in q)

Можно конечно ...

result = ''
for i in q:
    if i != ' ':
        result += i
    else:
        result += random.choice(string.punctuation + string.digits)
q = result

Второй пример - подробная версия примера с одной строкой выше. Чтобы понять это, вы можете разделить его на миры.

q = ''.join( LIST_COMPREHANSION )

Это объединяет с пустыми строками LIST_COMPREHANSION внутри. Вы можете проверить https://www.pythonforbeginners.com/basics/list-comprehensions -in-python для деталей. Это состоит из:

EXPRESSION for i in q

Само выражение является троичным оператором - https://book.pythontips.com/en/latest /ternary_operators.html :

i if i != ' ' else random.choice(string.punctuation + string.digits)

Однако использование str.replace не будет работать, второй аргумент является постоянным, и вы не можете использовать генератор случайных символов там.

2
Doncho Gunchev 15 Июл 2019 в 07:35

Не думаете ли вы, что генерация случайных чисел между значением ascii первой пунктуации (33) и последней пунктуации (47) будет проще реализовать. И тогда вы можете просто использовать его в своем коде, как обычно, используя его значение ascii, чтобы найти соответствующий символ.

Вы можете больше узнать о таблице ascii здесь:

<-Надеюсь, это упростит ваше решение.

<-UpVote If HelpFul

0
mudit rustagi 9 Июл 2019 в 05:35

Причина вашего TypeError в следующем:

x = ''.join(random.choice(lst)(c) for c in q)

random.choice(iterable) возвращает один случайный элемент в iterable, так как ваша итерация состоит из строк, она возвращает строку. Делая это (c), вы пытаетесь вызвать строку как функцию, это вызывает TypeError, потому что строка не вызывается.

Как насчет чего-то вроде этого:

def basewords():
    print("Enter base words here:")
    q = str(input("TIP: Enter your desired words seperated by spaces only.\n> "))
    specialchars = string.punctuation + string.digits
    def rand():
        return random.choice(specialchars)
    print(''.join(x.replace(' ', rand()) for x in q))

Демо-версия :

In [41]: basewords()
Enter base words here:
TIP: Enter your desired words seperated by spaces only.
> Hello World Dog House
Hello;World>Dog3House
1
salparadise 9 Июл 2019 в 05:25