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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2021, 20:56   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию Необязательные слова

здравствуйте,
Код:
var2 = [1,2,12]
var3 = var2 + [3,13,23,123]
var4 = var2 + var3 + [4,14,24,34,124,134,234,1234]
может что забыл?? как точно проверить?? как сгенерить варианты при наличии большего количества вариантов?
Код:
txt = '''это !здравствуйте+!, есть !знаком+! этим !словом+! число'''
if len(re.findall('!'.*?'\+!', txt) == 2:#не проверял)), по памяти написал
    repl = var2
как на выходе проще всего получить три варианта с массива var2, (несколько цифр подряд это значит +)
это !здравствуйте+!, есть этим число - 1
это !здравствуйте+!, есть !знаком+! этим число - 2
это !здравствуйте+!, есть !знаком+! этим !словом+! число - 1+2
Ципихович Эндрю вне форума Ответить с цитированием
Старый 02.02.2021, 22:04   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Допустим, простейшая генерация списков с вариантами.
Код:
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(i + [n])
    mem[n] = res
    return res

print(variants(5))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 03.02.2021, 08:13   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

спс за ответ, я не такой профи, чтобы понять, в коде есть переменные
n но нет txt, если предположить что начало положено

Код:
var2 = [1,2,12]
var3 = var2 + [3,13,23,123]
var4 = var2 + var3 + [4,14,24,34,124,134,234,1234]
txt = '''это !здравствуйте+!, есть !знаком+! этим !словом+! число'''
if len(re.findall('!'.*?'\+!', txt) == 2:
    repl = var2
то далее как прикрутить Ваш код,
расширьте пжл код, спс
Ципихович Эндрю вне форума Ответить с цитированием
Старый 03.02.2021, 18:44   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
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(10 * i + n)
    mem[n] = res
    return res

txt = '''это !здравствуйте+!, есть !знаком+! этим !словом+! число'''
repl = variants(len(re.findall('!.*?\+!', txt)))
print(repl)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 04.02.2021, 08:26   #5
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

спс, оказывается это только генератор вариантов, я то думал, что там всё и удивлялся краткости, ладно попробую доделать, выложу - может можно будет короче сделать.......
Ципихович Эндрю вне форума Ответить с цитированием
Старый 04.02.2021, 15:31   #6
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

делал, не доделал, те варианты, где замен несколько, например: '1+2'
пока три сосны ... запутался ...
что делать, чтобы доделать я в принципе знаю, но мне кажется что код будет огромный, не подскажите, как доделать, уверен, что у Вас покороче получится)), спс
Код:
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


def txtrepl_xy(xy, txtrepl):
    for ind, z in enumerate(mylist):
        if ind + 1 != xy:
            txtrepl = txtrepl.replace(z, '')
    return txtrepl


txt = '!1+! !2+! !3+!'
mylist = 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()
if len(mylist) == 1:
    print(f'''в строке среди замен, имеется только одна замена: {mylist}''')
    exit()
print(f'''количество замен: {len(mylist)}, замены: {mylist}''')  # => x помеченные слова
print(f'''количество вариантов замен: {len(repl)}, варианты замены: {repl}''')  # => x  ['1+2+5+6+7+10', ...
txtrepl, txtrepl_all = '', ''
for x in repl:
    txtrepl = txt
    if '+' in str(x):
        # print('i -', x)
        for y in x.split('+'):
            xy = int(y)
            txtrepl = txtrepl_xy(xy, txtrepl)
    else:
        xy = x
        txtrepl = txtrepl_xy(xy, txtrepl)

    # удалить пробелы с обеих сторон строки
    txtrepl = txtrepl.strip()
    print(txtrepl)
    txtrepl_all = txtrepl_all + txtrepl + ';' + '\n'
print(txtrepl_all)
print('End')
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2021, 00:21   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Восклицательными знаками пожертвовал:
Код:
from collections import Counter

def beautiful_variants(k):
    v1 = []
    for i in range(1, 2 ** k):
        v2 = []
        for j in range(0, k):
            if ((i >> j) & 1):
                v2.append(str(j + 1))
        v1.append('+'.join(v2))
    return v1

txt = '!1+! !2+! !3+!'
txt_parts = txt.split('!')
txt_parts_len = len(txt_parts)

if txt_parts_len < 3:
    print('в строке нет замен')
    exit()

if txt_parts_len % 2 == 0:
    print('в строке не хватает восклицательных знаков')
    exit()

repls = [repl for i, repl in enumerate(txt_parts) if i % 2]
repls_len = len(repls)

if repls_len == 1:
    print(f'''в строке среди замен, имеется только одна замена: {repls}''')
    exit()

if repls_len != len(set(repls)):
    repl_dublicates = [k for k, v in Counter(repls).items() if v > 1]
    print(f'''в строке среди замен: {repls} имеются дубликаты в количестве: {len(repl_dublicates)}, дубликаты: {repl_dublicates}''')
    exit()

print(f'''количество замен: {repls_len}, замены: {repls}''')
print(f'''количество вариантов замен: {2 ** repls_len - 1}, варианты замены: {beautiful_variants(repls_len)}''')

variants = []
for i in range(1, 2 ** repls_len):
    v = []
    for j, s in enumerate(txt_parts):
        if j % 2 == 0 or (i >> (j // 2)) & 1:
            v.append(s)
    variants.append(''.join(v).strip())
print(';\n'.join(variants))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 05.02.2021 в 00:25.
BDA на форуме Ответить с цитированием
Старый 05.02.2021, 15:13   #8
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

спасибо большое
мой вариант
могли бы глянуть и подправить, а то 5 и 6 вариант дублируются-Не правильно определены
Код:
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', ...
i, mylist_x_1, txtrepl, txtrepl_all = 0, '', '', ''
for x in repl[:-1]:  # без последней замены, так как если её сделать строка совпадает с исходным текстом
    # print(x)
    i += 1
    txtrepl = ''
    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, txtrepl)
txtrepl_all = re.sub(r'  *', ' ', txtrepl_all)  # два и более пробела заменить на один пробел
print(txtrepl_all)
print('End')
и в строке
Код:
txtrepl_all = re.sub(r'  *', ' ', txtrepl_all)  # два и более пробела заменить на один пробел
не сработало как хотел, спс

Последний раз редактировалось Ципихович Эндрю; 05.02.2021 в 15:55.
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2021, 19:17   #9
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
и в строке
Код:
txtrepl_all = re.sub(r' *', ' ', txtrepl_all) # два и более пробела заменить на один пробел
не сработало как хотел
уж не знаю, как это было, сейчас проверил, всё
Код:
import re
txtrepl_all = 'как  дела'
print(len(txtrepl_all))
txtrepl_all1 = re.sub(r'  *', ' ', txtrepl_all)  # два и более пробела заменить на один пробел
print(len(txtrepl_all1))
exit(0)
хорошо
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.02.2021, 19:57   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
'  *' # это один пробел и более
# чтобы было 2 и более:
'  +'
# или
' {2,}'
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
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