Случайно использовать заглавные буквы в строке

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

i =0             
for c in sentence:
    case = random.randint(0,1)
    print("case = ", case)
    if case == 0:
        print("here0")
        sentence[i] = sentence[i].lower()
    else:
        print("here1")
        sentence[i] = sentence[i].upper()
    i += 1
print ("new sentence = ", sentence)

И получите ошибку: TypeError: объект 'str' не поддерживает назначение элемента

Но тогда как еще я мог это сделать?

Ответ 1

Вы можете использовать str.join с выражением генератора следующим образом:

from random import choice
sentence = 'Hello World'
print(''.join(choice((str.upper, str.lower))(c) for c in sentence))

Образец вывода:

heLlo WORLd

Ответ 2

Создайте новую строку.

Вот решение с небольшими изменениями в вашем исходном коде:

>>> import random
>>> 
>>> def randomcase(s):
...:    result = ''
...:    for c in s:
...:        case = random.randint(0, 1)
...:        if case == 0:
...:            result += c.upper()
...:        else:
...:            result += c.lower()
...:    return result
...:
...:
>>> randomcase('Hello Stackoverflow!')
>>> 'hElLo StaCkoVERFLow!'

редактировать: удалил мои вкладыши, потому что я люблю blhsing лучше.

Ответ 3

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

import random
sentence = "This is a test sentence" # Strings are immutable
i =0
new_sentence = [] # Lists are mutable sequences
for c in sentence:
    case = random.randint(0,1)
    print("case = ", case)
    if case == 0:
        print("here0")
        new_sentence += sentence[i].lower() # append to the list
    else:
        print("here1")
        new_sentence += sentence[i].upper() # append to the list
    i += 1
print ("new sentence = ", new_sentence)

# to print as string
new_sent = ''.join(new_sentence)
print(new_sent)

Ответ 4

sentence='quick test' 
print(''.join([char.lower() if random.randint(0,1) else char.upper() for char in sentence]))

qUiCK TEsT

Ответ 5

Вы можете сделать как ниже

char_list = []            
for c in sentence:
    ucase = random.randint(0,1)
    print("case = ", case)
    if ucase:
        print("here1")
        char_list.append(c.upper())
    else:
        print("here0")
        char_list.append(c.lower())
print ("new sentence = ", ''.join(char_list))

Ответ 6

Одним из способов без использования цикла Python будет отправить его в NumPy и сделать векторизацию над этим. Например:

import numpy as np
def randomCapitalize(s):
    s  = np.array(s, 'c').view('u1')
    t  = np.random.randint(0, 2, len(s), 'u1') # Temporary array
    t *= s != 32 # ASCII 32 (i.e. space) should not be lowercased
    t *= 32 # Decrease ASCII by 32 to lowercase
    s -= t
    return s.view('S' + str(len(s)))[0]
randomCapitalize('hello world jfwojeo jaiofjowejfefjawivj a jofjawoefj')

какие выводы:

b'HELLO WoRlD jFwoJEO JAioFjOWeJfEfJAWIvJ A JofjaWOefj'

Это решение должно быть достаточно быстрым, особенно для длинных струн. У этого метода есть два ограничения:

  • Ввод должен быть полностью строчным. Вы можете .lower() попробовать .lower() но это технически малоэффективно.

  • Это требует особой заботы о не-к-з персонажу. В приведенном выше примере обрабатывается только пробел

Вы можете обрабатывать гораздо больше специальных символов одновременно, заменив

t *= s != 32

с

# using space, enter, comma, period as example
t *= np.isin(s, list(map(ord, ' \n,.')), invert=True)

Например:

s = 'ascii table and description. ascii stands for american standard code for information interchange. computers can only understand numbers, so an ascii code is the numerical representation of a character such as'
randomCapitalize(s)

какие выводы:

b'ascII tABLe AnD descRiptIOn. ascii sTaNds for AmEricAN stanDaRD codE FOr InForMAtION iNTeRCHaNge. ComPUtERS can onLY UNdersTand nUMBers, So An asCIi COdE IS tHE nuMERIcaL rEPrEsEnTATion Of a CHaractEr such as'