Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2021, 20:03   #11
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,040
По умолчанию

финиш, сделал
Код:
import re

mem = {1: [1]}


def variants(n):
    if n in mem:
        return mem[n]
    prev = variants(n - 1)
    res = prev + [n]
    for i in prev:
        res.append(f'{i}+{n}')  # => [1, 2, '1+2']
        # res.append(10 * i + n)  # => [1, 2, 12]
    mem[n] = res
    return res


txt = '!первая+! 111111 !вторая+! 2222222 !третья+!'
txt_parts_start = chr(33)  # '!' - восклицательный знак
# '/+!' - обратная косая черта - бэкслеш + знак плюса + восклицательный знак
txt_parts_end = chr(92) + chr(43) + chr(33)
re_findall = f'{txt_parts_start}.*?{txt_parts_end}'
mylist = re.findall(re_findall, txt)
repl = variants(len(mylist))
# получить, значения являющихся дубликатами в списке, Counter - Счетчик
from collections import Counter

if len([k for k, v in Counter(mylist).items() if v > 1]) != 0:
    print(f'''в строке среди замен: {mylist}
имеются дубликаты, их количество: {len([k for k, v in Counter(mylist).items() if v > 1])}
дубликаты: {[k for k, v in Counter(mylist).items() if v > 1]}''')
    exit()
elif len(mylist) == 1:
    print(f'''в строке среди замен, имеется только одна замена: {mylist}''')
    exit()
elif len(mylist) == 0:
    print(
        f'''в строке отсутствуют замены, выделенные знаками: {chr(39)}{txt_parts_start}{chr(39)} и: {chr(39)}{txt_parts_end.replace(chr(92), '')}{chr(39)}''')
    exit()
print(
    f'''замены, выделенные знаками: {chr(39)}{txt_parts_start}{chr(39)} и: {chr(39)}{txt_parts_end.replace(chr(92), '')}{chr(39)}
количество замен: {len(mylist)}, замены: {mylist}''')  # => x помеченные слова
print(f'''количество вариантов замен: {len(repl)}, варианты замены: {repl}''')  # => x  ['1+2+5+6+7+10', ...
mylist_x_1, txtrepl, txtrepl_all = '', '', ''
for i, x in enumerate(repl[:-1]):  # без последней замены, так как если её сделать строка совпадает с исходным текстом
    # print(x)
    txtrepl, mylist_x_1 = '', ''
    if '+' not in str(x):
        # удалить пробелы с обеих сторон строки
        txtrepl = re.sub(mylist[int(x) - 1][:-2] + txt_parts_end, '', txt).strip()
    else:
        for y in x.split('+'):
            mylist_x_1 = mylist_x_1 + str(mylist[int(y) - 1][:-2] + txt_parts_end) + '|'
        # print(mylist_x_1)
        # удалить пробелы с обеих сторон строки, mylist_x_1 - без последнего знака, так как им будет вертикальная линия - '|'
        txtrepl = re.sub(mylist_x_1[:-1], '', txt).strip()

    txtrepl_all = txtrepl_all + txtrepl + ';'
    print(i + 1, txtrepl)
# два и более пробела заменить на один пробел, так 'r' *', ' ',' - НЕ сработает
# '*' знак звёздочки означает «ноль или более», то же самое, что и {0,}, то есть символ может повторяться много раз или вообще отсутствовать
txtrepl_all = re.sub(r'  *', ' ', txtrepl_all)
print(txtrepl_all)
print('End')
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2021, 20:03   #12
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,040
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
' *' # это один пробел и более
# чтобы было 2 и более:
' +'
# или
' {2,}'
спс
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2021, 20:10   #13
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,040
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
Сообщение от BDA
' *' # это один пробел и более
# чтобы было 2 и более:
' +'
# или
' {2,}'
с учётом сказанного, последние строки будут:
Код:
# два и более пробела заменить на один пробел, или ' {2,}', а ' *' - это один пробел и более
txtrepl_all = re.sub(r' +', ' ', txtrepl_all)
print(txtrepl_all)
print('End')
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2021, 20:55   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
' +' # это один пробел или более
'  +' # это два пробела и более
Я не знаю конечной цели программы, но на самом деле такое формирование вариантов мне не нравится, поэтому отказался от него в 7 посте. Получается, что удобство вывода на экран превалирует над удобством дальнейшего использования. Или использование Counter 3 раза вместо одного. Ну если программа завершена и вас всё устраивает, то ладно.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 05.02.2021, 21:01   #15
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,040
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
использование Counter 3 раза вместо одного
согласен-нужно править, но я этого не вижу, где оно?, как по мне - один раз используется
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2021, 21:17   #16
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
import timeit

print(timeit.timeit("""from collections import Counter
mylist = [1, 2, 3, 4, 5, 5, 5]
if len([k for k, v in Counter(mylist).items() if v > 1]) != 0:
    a = f'''в строке среди замен: {mylist} имеются дубликаты, их количество: {len([k for k, v in Counter(mylist).items() if v > 1])} дубликаты: {[k for k, v in Counter(mylist).items() if v > 1]}'''""",
    number = 100000
))

print(timeit.timeit("""from collections import Counter
mylist = [1, 2, 3, 4, 5, 5, 5]
new_list = [k for k, v in Counter(mylist).items() if v > 1]
if len(new_list) != 0:
    a = f'''в строке среди замен: {mylist} имеются дубликаты, их количество: {len(new_list)} дубликаты: {new_list}'''""",
    number = 100000
))
На практике в 2 раза медленнее получается.
Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
как по мне - один раз используется
Как же один, если слово "Counter" встречается 4 раза: 1 раз в импорте, 3 раза в коде.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 06.02.2021, 08:43   #17
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,040
По умолчанию

ок, можно ещё
Код:
if len(new_list) != 0:
заменить на:
Код:
if new_list:
сделал с применением
Код:
new_list = [k for k, v in Counter(mylist).items() if v > 1]
Цитата:
Сообщение от BDA Посмотреть сообщение
Как же один, если слово "Counter" встречается 4 раза: 1 раз в импорте, 3 раза в коде
теперь понял, просто когда дело идёт к exit() - я не сильно церемонюсь, всё равно на выход, ну а привыкать нужно, спс
Ципихович Эндрю вне форума Ответить с цитированием
Старый 06.02.2021, 08:58   #18
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,040
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Восклицательными знаками пожертвовал:
Код:
кодом в этом посте № 7 я сильно не занялся, потому, как там слова отделялись ! и !
а у меня они могут быть и !такие! и !такие+!, интересовали последние, как подправить код с этого поста на !такие+! слова?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 06.02.2021, 17:49   #19
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Если !слово! и !слово+! это одно и то же, то можно удалить плюсы перед проверкой замен:
Код:
repls = ['1', '2+', '3+']
for i, repl in enumerate(repls):
    if repl[-1] == '+':
        repls[i] = repl[:-1]
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 06.02.2021, 18:29   #20
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,040
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Если !слово! и !слово+! это одно и то же
в том-то и дело что НЕ одно и тоже
Ципихович Эндрю вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести слова предложения в таком порядке, чтобы последняя буква каждого слова совпадала с первой буквой следующего слова ( java ) huhu Помощь студентам 0 06.04.2012 19:42
Обязательные и необязательные вопросы Rusl92 PHP 2 27.06.2011 14:04
Необязательные параметры в процедуре. Alex Cones Общие вопросы Delphi 19 30.07.2010 20:57
Разбить текст на слова и произвести поиск каждого слова по текстовому массиву Burning_brook Microsoft Office Excel 2 22.05.2010 01:56
Необязательные параметры метода -как? boris-blade Общие вопросы .NET 2 24.03.2010 03:42