Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,317

Pattern matching

03.09.2022, 17:20. Показов 882. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте, как известно:
С релизом python 3.10 появился pattern matching, собственно и являющийся главной особенностью этого релиза. Возможно кто-то уже встречал его упрощенную версию - switch-case - в других языках программирование, но pattern matching это другое, это намного круче
и вот я крутил пример:
Python
1
2
3
4
5
6
7
8
9
mas = [1, 2, 3, 4, 5]
 
match mas:  # Указываем что сравнивать
    case [b, c, d, e]:
        print(b)
    case (b, c, d, e):
        print(b)
    case b, c, d, e:
        print(b)
что он показывает? спс я не понял.....
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2022, 17:20
Ответы с готовыми решениями:

ERROR: No matching distribution found for PyQt4
здравствуйте, ставил модуль командой: pip install PyQt4 но потом в Пайчарме выдаёт ошибку ERROR: Could not find a version that...

TypeError: cannot use a string pattern on a bytes-like object
#!/usr/bin env python import subprocess import optparse import re def get_arguments(): parser = optparse.OptionParser()...

matching query does not exist
Есть вьюха поиска города: class SearchCityView(ListView): model = City template_name = 'cities/search.html' ...

17
2431 / 1474 / 633
Регистрация: 01.11.2021
Сообщений: 2,269
03.09.2022, 17:39
Сопоставляет, наверно, верное будет слово.
[1, 2, 3, 4, 5] и cases.
В списке 5 элементов, поэтому не будет ничего выполнено. В общем типа распаковывает и количество элементов должно совпадать с каким-то вариантом, тогда обработает, сопоставит значения переменным.
Python
1
2
3
4
5
6
7
8
9
mas = [1, 2, 3]
 
match mas:  # Указываем что сравнивать
    case [b, c, d, e]:
        print(b)
    case (b, c, d, e, f):
        print(c)
    case b, c, d:
        print(d)
Добавлено через 4 минуты
Соответствие структуре шаблона, конструкция match/case.
https://docs-python.ru/tutoria... atch-case/
1
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,317
03.09.2022, 17:39  [ТС]
тогда для понимания лучше так:
Python
1
2
3
4
5
6
7
8
9
mas = [6, 2, 3, 4]
 
match mas:  # Указываем что сравнивать
    case [b, c, d, e]:  # Выполнит это и напечает первый элемент спсика, т.е. он ему будет сопоставлен.
        print(b) # 6
    case (b, c, d, e):
        print(b) # почему пусто?
    case b, c, d, e:
        print(b) # почему пусто?
но есть два вопроса, они в коде
0
2431 / 1474 / 633
Регистрация: 01.11.2021
Сообщений: 2,269
03.09.2022, 17:46
Соответствие шаблону базовой структуры.

Хотя оператор соответствия match может использоваться как простой оператор if/else, как показано выше, он действительно эффективен, когда нужно сопоставить структурированные данные:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def normalise_colour_info(colour):
    """Нормализация структуры цвета, как (name, (r, g, b, alpha))."""
    match colour:
        case (r, g, b):
            name = ""
            a = 0
        case (r, g, b, a):
            name = ""
        case (name, (r, g, b)):
            a = 0
        case (name, (r, g, b, a)):
            pass
        case _:
            raise ValueError("Unknown colour info.")
    return (name, (r, g, b, a))
 
>>> print(normalise_colour_info((240, 248, 255)))
# ('', (240, 248, 255, 0))
>>> print(normalise_colour_info((240, 248, 255, 0)))
# ('', (240, 248, 255, 0))
>>> print(normalise_colour_info(("AliceBlue", (240, 248, 255))))
# ('AliceBlue', (240, 248, 255, 0))
>>> print(normalise_colour_info(("AliceBlue", (240, 248, 255, 0.3))))
# ('AliceBlue', (240, 248, 255, 0.3))
Обратите внимание, что каждый case содержит выражение, подобное левой части присвоения с распаковкой, и когда структура цвета совпадает со структурой, указанной в определенном case, то тогда значения присваиваются переменным, указанным в case.

Добавлено через 1 минуту
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
тогда для понимания лучше так:
Это как if/elif/else, выполнил одно, что первое совпало, остальное пропустит.

Добавлено через 4 минуты
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
но есть два вопроса, они в коде
Твой код эквивалентен этому.
Python
1
2
3
4
5
6
7
8
9
10
mas = [1, 2, 3, 4]
if len(mas) == 4:
    a, b, c, d = [1, 2, 3, 4]
    print(a)
elif len(mas) == 4:
    a, b, c, d = [1, 2, 3, 4]
    print(a)
elif len(mas) == 4:
    a, b, c, d = [1, 2, 3, 4]
    print(a)
1
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,317
21.10.2023, 06:12  [ТС]
здравствуйте, вынужден вернуться к топику.........
Python
1
2
3
4
5
mas = [1, 2, 3, 4, 5, 'r', 'u'] # где искать
find = [2, 12, 8, 'r'] # что искать
match mas:  # где искать
    case find: # что искать
        print("как бы здесь вывело найденное, то есть 'r' и 8????")
вопрос в коде, это возможно?
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
21.10.2023, 07:49
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
возможно?
возможно, но не так...
Python
1
2
3
4
5
6
7
mas = [1, 2, 3, 4, 5, 'r', 'u'] # где искать
find = [2, 12, 8, 'r'] # что искать
out = []
for item in find:
    if item in mas:
        out.append(item)
print('Найдено:', out)
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,317
21.10.2023, 07:50  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
возможно, но не так...
это мне известно, а где мощь
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
pattern matching это другое, это намного круче
??
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
21.10.2023, 08:42
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
это намного круче
это ничем не круче, ибо без цикла проблематично...
Ну, если очень хочется именно через match-case, то можно так:
Python
1
2
3
4
5
6
7
8
9
mas = [1, 2, 3, 4, 5, 'r', 'u']
find = [2, 12, 8, 'r']
out = []
while find:
    match find:
        case [x, *tail] if x in mas:
            out.extend([x])
    find = tail
print(out)
а мощь, там немного для другого...
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
21.10.2023, 08:49
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
mas = [1, 2, 3, 4, 5, 'r', 'u'] # где искать
find = [2, 12, 8, 'r'] # что искать
они вообще даже близко не похожи, а матчинг это именно про совпадение

особо надежды не тешу что станешь документацию читать или в примере разбираться но
Python
1
2
3
4
5
6
a_list = [2, 3, 4, 'r', 'u']
match a_list:
    case *other, 4, 'r', x:
        print(x) # тут выведет u так как совпал паттерн
    case _:
        print("not match")
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,317
21.10.2023, 08:58  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
a_list = [2, 3, 4, 'r', 'u']
match a_list:
    case *other, 4, 'r', x:
        print(x) # тут выведет u так как совпал паттерн
    case _:
        print("not match")
х=икс без 'х' значит не текст, а что тогда это такое?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
21.10.2023, 09:00
Ципихович Эндрю, это переменная, добро пожаловать на курс питон для начинающих. Матчинг ищет паттерн в том что ему дали и если совпадает то присваивает значения переменным

Ты объясни все таки почему не стал доку читать или книгу по паттерн матчингу и разбираться ?
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,317
21.10.2023, 09:06  [ТС]
а вообще задача стоит так, ищем нечто, оно в списке, его размер порядка 887933 шт.
все эти 887933 шт. нужно искать в тексте, как быстрее искать
1
когда этот текст будет в массиве поабзацно и их количество 27073
2
в тексте, который будет целиком разделён абзацами

какой-то вариант поиска в пару минут вложится? какой вариант лучше?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
21.10.2023, 09:08
регулярки, если не справятся то раскидать на процессы.
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,317
21.10.2023, 09:15  [ТС]
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
1
когда этот текст будет в массиве поабзацно и их количество 27073
это вариант искал 23 минуты
Python
1
2
3
4
5
vFindTextDoc = []
for item in vFindText:
    if item in text_doc:
        vFindTextDoc.append(item)
print('Найдены совпадения:', vFindTextDoc)
по окончанию ответ:
Количество замен в текстовом файле: 888688
doc файл это список, его размер: 27073
Количество замен в текстовом файле, которые имеются в doc файле: 3
Начато 2023-10-21 10:45:15.239854
Окончено 2023-10-21 11:08:56.510010
самое обидное, что найденного должно быть тьма, а не три штуки

сейчас второй вариант опробую
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
21.10.2023, 09:44
Цитата Сообщение от Welemir1 Посмотреть сообщение
в примере разбираться но
ему же надо сравнить коллекции и вывести одинаковые элементы... причем именно в match-case, хочется...
А вообще, скажем в powershell, для этого есть спец. командлет:
PowerShell
1
2
3
$a = @(1, 2, 3, 4, 5, 'r', 'u')
$b = @(2, 12, 8, 'r')
diff $a $b -incl|? sideindicator -eq '=='
не знаю, есть ли что-то аналогичное в python, но думаю, что наверняка есть, ибо подобные задачи не редко возникают...

Добавлено через 6 минут
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
какой-то вариант поиска в пару минут вложится? какой вариант лучше?
Из Вашего объяснения непонятно, что именно искать и на что именно надо менять...
Ну, два списка, ну нашли в первом совпадения с элементами со второго списка... а менять-то на что найденное? Задача какова?
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,317
21.10.2023, 10:12  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
искать
говорил
Цитата Сообщение от YuS_2 Посмотреть сообщение
менять
или
заменять
не говорил
нужно искать и вывести найденное

Добавлено через 25 минут
так как то, что ищем перед поиском отсортировано по убыванию длины данных от большего к меньшему
то наверное лучше искать НЕ в массиве а искать в сплошном тексте, и с каждым найденным искомым удалять его после его удаления сам тест уменьшается.......
будет прогресс?
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,214
21.10.2023, 13:00
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
заменять
не говорил
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
Количество замен в текстовом файле: 888688
doc файл это список, его размер: 27073
Количество замен в текстовом файле, которые имеются в doc файле: 3
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
будет прогресс?
прогресс будет, только если описать внятно задачу (не работу предполагаемого кода, а именно задачу), привести примеры текста (подаваемого на вход), а также примеры вывода, т.е. четко описать какие действия требуются от программы. Иначе только скилл телепатии включать... у меня он поломался, починят не скоро.
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,317
21.10.2023, 14:19  [ТС]
YuS_2, насколько мне известно in это самый быстрый поиск, мой код:
Python
1
2
3
4
5
lst_replace_in_doc = []
for l in vFindText: 
    if l in doc_text:
        i += 1
        lst_replace_in_doc.append(l)
за время чуть менее часа, а точнее:
Начато 2023-10-21 14:23:40.368835
Окончено 2023-10-21 15:13:56.505702
в тексте doc_text, который равен тексту из 27073 абзацев
из возможных кандидатов на замену, из vFindText, он равен 903512
нашёл список из 31043 возможных кандидатов на замену, вот и нужен прогресс, более быстрый поиск,
на вход подаётся список и в моём случае текст-в представленном коде, но можно подать вместо текста список, на выходе нужен список из возможных кандидатов на замену
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.10.2023, 14:19
Помогаю со студенческими работами здесь

Design Pattern - Strategy
Всем привет! Хочется услышать мнение со стороны о получившемся коде. Все работает, и вроде как надо, но, не знаю, 6-е чувство подсказывает,...

ERROR: No matching distribution found for flask
Появилась задача создать веб-приложение на Python сервер/клиент, до этого изучала только азы Python по учебнику. Нашла несколько гайдов,...

ERROR: No matching distribution found for torch
решил установить Novel Ai, мне выдало следующее: venv "D:\моя ерунда\stable-diffusion-webui\venv\Scripts\Python.exe" Python 3.11.0...

Selenium.common.exceptions.SessionNotCreatedException: Message: session not created: No matching capabilities found
Здравствуйте я пишу парсер youtube(без api), но когда я делаю запрос с помощью requests, там не выполняется javascript я решил использовать...

LANGUAGE_CODE "en-us" must have a matching entry in LANGUAGES
Развернул проект на Django, настройки в settings.py подправил (данные по базе). При заходе на http://www.megalopolis.djangohost.name/...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru