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
4322
Регуляркой надо... (и язык после этого вообще маловажен)

 Профиль  
                  
 
 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
3054
Уфа
Если посмотреть с точки зрения языка, "что-нибудь" — одно слово, а не два. И капитализировать его надо как "Что-нибудь", а не как "Что-Нибудь". А если слово начинается с дефиса, то таких слов не бывает, но если всё-таки бывает, то дефис капитализировали, а остальные буквы не надо. Так что, 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
8495
Цюрих

(Оффтоп)

А еще можно вспомнить, что приведение регистра локалезависимое - в английском заглавная 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, Супермодераторы



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

Сейчас этот форум просматривают: HungryLion


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

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