2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Phyton Слова с прописной буквы
Сообщение20.03.2021, 19:20 
Аватара пользователя


30/11/07
386
Уважаемые корифеи Python-а!
Есть задача.

Слова с прописной буквы
Дана строка. Измените регистр символов в этой строке так, чтобы первая буква каждого слова была заглавной, а остальные буквы — строчными.

Решение оформите в виде функции
Код:
Capitalize(S)
, возвращающей новую строку.

Примеры
Ввод
Код:
-a-bb-ccc
Вывод
Код:
-A-Bb-Ccc

Ввод
Код:
In a hole in the ground there lived a hobbit.
Вывод
Код:
In A Hole In The Ground There Lived A Hobbit.

Ввод
Код:
Everyone OF uS HAS all wE NEED
Вывод
Код:
Everyone Of Us Has All We Need


Код Python
Код:
def capitalize(s):
  return ' '.join([s.capitalize() for s in s.split()])
s=input()
print(capitalize(s))


Код составленный на Python-е позволяет решить 2-а последние задачи, но он не действует для случая
Код:
-a-bb-ccc

На Ввод
Код:
-a-bb-ccc
Выход
Код:
-a-bb-ccc


Помогите разобраться как написать верный код учитывающий дефиз?

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение20.03.2021, 20:09 
Заслуженный участник


27/04/09
28128
Обычно в таких задачах даны ограничения на входную строку. Какие символы в ней встречаются? Какие символы считаются строчными и прописными буквами?

-- Сб мар 20, 2021 22:09:30 --

(Не советую браться решать задачи, где такие ограничения не даны.)

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 01:15 


27/06/20
337
Можно попробовать так
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
На_вход = ['-a-bb-ccc',
           'In a hole in the ground there lived a hobbit.',
           'Everyone OF uS HAS all wE NEED']

def capitalize(строка):
    на_выход = ''
    внутри_слова = False
    разделители = (' ', '\n', '\t', ',', '.', ';', '-', ':')
    for символ in строка:
        if внутри_слова and символ in разделители:
            на_выход += символ
            внутри_слова = False
        elif not внутри_слова and символ in разделители:
            на_выход += символ
        elif not внутри_слова:
            на_выход += символ.upper()
            внутри_слова = True
        elif внутри_слова:
            на_выход += символ.lower()
    return на_выход

for строка in На_вход:
    print(capitalize(строка))

Он же по ссылке

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 01:57 
Заслуженный участник
Аватара пользователя


01/09/13
4319
Регуляркой надо... (и язык после этого вообще маловажен)

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 02:54 
Заслуженный участник


27/04/09
28128
ipgmvq в сообщении #1510264 писал(а):
разделители = (' ', '\n', '\t', ',', '.', ';', '-', ':')
Ха и ещё раз ха, а вдруг там * разделитель. А вдруг ~́ː•? Зачем решать недоформулированную задачу? Кому это поможет?

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 03:12 


27/06/20
337
arseniiv в сообщении #1510274 писал(а):
Зачем решать недоформулированную задачу?
Мы же не знаем обстоятельств использования этого кода. Вы предположили, что это недоформулированная задача от какого-то заказчика. Я предположил, что код используется для себя и автора действительно беспокоит только пробел и дефис. Я домыслил ещё несколько знаков препинания. А также что приведенный более высокоуровненый код взят из форума stackoverflow. Мой же более низкоуровневый примитив прям напрашивается. После уточнения задачи можно добавить дополнительные разделители или развернуть задачу и специфицировать буквы, цифры и апострофы, а всё остальное считать пробелами между словами. Помогает тем, что после доформулирования можно код чуть изменить и готово. :-)

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 10:03 
Заслуженный участник
Аватара пользователя


01/08/06
3053
Уфа
Если посмотреть с точки зрения языка, "что-нибудь" — одно слово, а не два. И капитализировать его надо как "Что-нибудь", а не как "Что-Нибудь". А если слово начинается с дефиса, то таких слов не бывает, но если всё-таки бывает, то дефис капитализировали, а остальные буквы не надо. Так что, Eiktyrnir, всё правильно ваша программа делает. Кто говорит, что неправильно и почему?

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 14:14 


10/03/16
3995
Aeroport
Geen в сообщении #1510269 писал(а):
и язык после этого вообще маловажен

regexp это уже сам по себе язык :mrgreen: :mrgreen: :mrgreen:

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 14:31 
Аватара пользователя


30/11/07
386
worm2 в сообщении #1510291 писал(а):
Так что, Eiktyrnir, всё правильно ваша программа делает. Кто говорит, что неправильно и почему?

Сайт школы СИРИУСа считает решение данной задачи таким образом неверным...Пробовал уже несколько вариантов
Вариант №1
Код:
def capitalize(s):
  import re
  return re.sub(r'\w+', lambda x: x.group().title(), s)
s=input()
print (capitalize(s))

Вариант №2 (особенно мне нравится но тоже нет)
Код:
def Capitalize(S):
   return S.title()
S = input()
print (Capitalize(S))

и наконец вариант №3
Код:
def capitalize(s):
    res = []
    flag = True
    for s in s.lower():   
        if  s.isalpha():
            if flag:
                flag = False
                s = s.upper()
        else:
            flag = True
        res.append(s)       
    return ''.join(res)
s=input()
print(capitalize(s))

Сейчас попробую вариант
ipgmvq в сообщении #1510264 писал(а):
Можно попробовать так
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
На_вход = ['-a-bb-ccc',
           'In a hole in the ground there lived a hobbit.',
           'Everyone OF uS HAS all wE NEED']

def capitalize(строка):
    на_выход = ''
    внутри_слова = False
    разделители = (' ', '\n', '\t', ',', '.', ';', '-', ':')
    for символ in строка:
        if внутри_слова and символ in разделители:
            на_выход += символ
            внутри_слова = False
        elif not внутри_слова and символ in разделители:
            на_выход += символ
        elif not внутри_слова:
            на_выход += символ.upper()
            внутри_слова = True
        elif внутри_слова:
            на_выход += символ.lower()
    return на_выход

for строка in На_вход:
    print(capitalize(строка))

Он же по ссылке

...может все получится...отпишусь...

-- Вс мар 21, 2021 13:35:41 --

ipgmvq в сообщении #1510264 писал(а):
Можно попробовать так
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
На_вход = ['-a-bb-ccc',
           'In a hole in the ground there lived a hobbit.',
           'Everyone OF uS HAS all wE NEED']

def capitalize(строка):
    на_выход = ''
    внутри_слова = False
    разделители = (' ', '\n', '\t', ',', '.', ';', '-', ':')
    for символ in строка:
        if внутри_слова and символ in разделители:
            на_выход += символ
            внутри_слова = False
        elif not внутри_слова and символ in разделители:
            на_выход += символ
        elif not внутри_слова:
            на_выход += символ.upper()
            внутри_слова = True
        elif внутри_слова:
            на_выход += символ.lower()
    return на_выход

for строка in На_вход:
    print(capitalize(строка))

Он же по ссылке

Уважаемый...пытаюсь адаптировать предложенный вами код под требования СИРИУСа...
Вообщем должно быть так
Код:
def Capitalize(S):
...
S = input()
print (Capitalize(S))

Там где ... должен быть основной текст программки... Немогу никак с этим справиться...У вас заранее все варианты заданий вбиты в переменную На_вход....Как бы переделать? :shock: :oops:

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 14:43 
Заслуженный участник


27/04/09
28128
ipgmvq в сообщении #1510276 писал(а):
Мы же не знаем обстоятельств использования этого кода. Вы предположили, что это недоформулированная задача от какого-то заказчика.
Да упаси Диэдр заказчика — с платформы по решению учебных программистских задач и автоматического тестирования их у них на сервере с выдачей галочек участникам, которые решили задачу. Но на такой платформе обязательно будут условия, хоть бы даже коряво сформулированные, но будут. Учебная программистская задача в чистом виде — это нечто с пред- и постусловиями, ибо мы не можем решать задачу для совершенно произвольных условий — времени не хватит на написание и никого это не научит чему-то полезному.

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

ipgmvq в сообщении #1510276 писал(а):
Я предположил, что код используется для себя и автора действительно беспокоит только пробел и дефис.
Тогда опять же он мог бы сначала точнее поставить задачу, потому что ему скорее всего нужно всё-таки конкретное решение, а не произвольно домысленное, так как этот код будет вставлен куда-то и работать в какой-то конкретной среде, диктующей пред- и постусловия.

ipgmvq в сообщении #1510276 писал(а):
Я домыслил ещё несколько знаков препинания.
Это безусловно очень полезное занятие. Лучше бы домыслили категории Punctuation, Symbol и Separator из уникода тогда, вместо такого списка. Стандарту сто лет, во входных данных может встретиться что угодно — давайте его игнорировать и думать по-старинке в терминах ASCII и кодовых страниц! (Точнее, одной кодовой страницы, Windows-1251, кому нужны другие?..)

ipgmvq в сообщении #1510276 писал(а):
После уточнения задачи можно добавить дополнительные разделители или развернуть задачу и специфицировать буквы, цифры и апострофы, а всё остальное считать пробелами между словами.
Да, может быть полезнее выделять «слова» чем их разделители, но ещё лучше может быть выделять точки начала и конца слов, и тут уже лучше вооружиться регулярными выражениями как советует Geen. Но не до специализации задачи. Потому что будет переписываться десять раз после каждого «а ещё надо чтобы было так и не было эдак». Это не нужно никому хотя бы потому что создаёт впечатление, что это близко к оптимальной моде коммуникации.

-- Вс мар 21, 2021 16:45:06 --

Eiktyrnir
Если они совсем-совсем не пишут требования к входным и выходным строкам и их точной связи, постарайтесь (если возможно) с ними не иметь дела — неужели оно стоит угадайки?

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 14:48 


27/06/20
337
Eiktyrnir
Наверное, так:
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
def Capitalize(S):
    на_выход = ''
    внутри_слова = False
    разделители = (' ', '\n', '\t', ',', '.', ';', '-', ':')
    for символ in S:
        if внутри_слова and символ in разделители:
            на_выход += символ
            внутри_слова = False
        elif not внутри_слова and символ in разделители:
            на_выход += символ
        elif not внутри_слова:
            на_выход += символ.upper()
            внутри_слова = True
        elif внутри_слова:
            на_выход += символ.lower()
    return на_выход

S = input()
print (Capitalize(S))


-- 21.03.2021, 15:01 --

arseniiv в сообщении #1510337 писал(а):
Лучше бы домыслили категории Punctuation, Symbol и Separator
из уникода тогда, вместо такого списка. Стандарту сто лет, во входных данных может встретиться что угодно — давайте его игнорировать и думать по-старинке в терминах ASCII и кодовых страниц! (Точнее, одной кодовой страницы, Windows-1251, кому нужны другие?..)
Полностью согласен. И заметьте, что я использовал методы
Используется синтаксис Python
символ.lower()
символ.upper()
которые работают с Unicode, а не только ASCII, а не делал нечто вроде
Используется синтаксис Python
print(chr(ord(символ)+32))
print(chr(ord(символ)-32))
:D
Вы же видите, что автор темы пользуется идиомами с list comprehension, но не пишет сам более низкоуровневую функцию. Я это написал в таком виде в учебных целях, а не для "production". :wink:

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 15:54 
Аватара пользователя


30/11/07
386
ipgmvq в сообщении #1510340 писал(а):
Eiktyrnir
Наверное, так:
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
def Capitalize(S):
    на_выход = ''
    внутри_слова = False
    разделители = (' ', '\n', '\t', ',', '.', ';', '-', ':')
    for символ in S:
        if внутри_слова and символ in разделители:
            на_выход += символ
            внутри_слова = False
        elif not внутри_слова and символ in разделители:
            на_выход += символ
        elif not внутри_слова:
            на_выход += символ.upper()
            внутри_слова = True
        elif внутри_слова:
            на_выход += символ.lower()
    return на_выход

S = input()
print (Capitalize(S))


При вводе
Код:
-a-bb-ccc

Ваша программка выдает
Код:
-A-Bb

При вводе
Код:
In a hole in the ground there lived a hobbit.

Она выдает
Код:
In

т.е. он упорно дальше не преобразовывает...((((

-- Вс мар 21, 2021 15:38:04 --

Eiktyrnir в сообщении #1510351 писал(а):
ipgmvq в сообщении #1510340 писал(а):
Eiktyrnir
Наверное, так:

Да так... Беру свои слова обратно насчёт того что не преобразовывает...перепроверил, всё нормально... Но проверчик СИРИУСа не преклонен....(выдаёт ошибку) :oops: :oops: :oops:

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 16:45 
Заслуженный участник
Аватара пользователя


16/07/14
8458
Цюрих

(Оффтоп)

А еще можно вспомнить, что приведение регистра локалезависимое - в английском заглавная i это I, а в турецком İ...

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 17:05 
Аватара пользователя


30/11/07
386
Короче ВОТ КОД КОТОРЫЙ УДОВЛЕТВОРИЛ СИРИУС
Код:
def Capitalize(S):
    c=''
    for i in range(0,len(S)):
        if S[i].isupper() and S[i-1].isalpha()==True and i!=0:
            c+=S[i].lower()
        elif S[i].islower() and S[i-1].isalpha()==False or i==0:
            c+=S[i].upper()
        else:
            c+=S[i]
    return c
S = input()
print(Capitalize(S))

ВСЕМ ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!
Ссылка
https://www.cyberforum.ru/python-beginn ... st15352630

 Профиль  
                  
 
 Re: Phyton Слова с прописной буквы
Сообщение21.03.2021, 17:43 


27/06/20
337
mihaild

(Оффтоп)

Да, хорошее замечание.


arseniiv

(Оффтоп)

Я тут какое-то время назад получил электронное письмо на хорошем английском языке (как обычно в HTML) о том, что ФБР якобы начало против меня какое-то расследование (уже не помню по какому поводу, кажется за якобы доставку какой-то посылки в США в нарушение таможенных правил, или какой-то похожий бред). Смотрю raw код письма: исходящие домены подставные и e-mail подставные, а в теле письма, подчеркиваю, на отличном английском стоит кодировка Windows-1251. У меня конечно есть задняя мысль, что это китайцы такие умные, стрелочки переводят. Но понимая так сказать уровень наших, не удивлюсь, если проверить locale и кодировку HTML на своем сервере у них ума не хватило.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group