Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Python

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

Открыть новую тему     Написать ответ в эту тему

Adm10



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здесь обсуждается всё, что связано с использованием Python: программирование, библиотеки, ресурсы и другие вопросы

Python


Python - высокоуровневый язык программирования общего назначения с динамической типизацией и автоматическим управлением памятью, ориентированный на повышение производительности разработчика, читаемости кода и его качества, а также на обеспечение переносимости написанных на нём программ

С чего начать?
Простой, понятный и вместе с тем грамотный ресурс на русском языке: pythonworld.ru + самоучитель
Библия PEP8

Всего записей: 35 | Зарегистр. 13-10-2006 | Отправлено: 15:48 16-06-2007 | Исправлено: shrmn, 22:22 07-03-2021
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DJMC
 
Объявления о работе для программистов

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 10:43 22-09-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DJMC

Цитата:
теперь ищем дубликаты и получим 8 вариантов


Код:
import itertools as it
import re
 
 
def get_combinations(str):
    m = re.findall(r'\((.*?)\)', str)
    a = [v.split(',') for v in m]
    return [''.join(x) for x in it.product(*a)]
 
 
def find_dupes(strs):
    seen = set()
    dupes = []
    for str in strs:
        if str in seen:
            dupes.append(str)
        else:
            seen.add(str)
    return dupes
 
 
strs = [
    '1-(1,X);2-(1,X);3-(2);4-(1,X);5-(X,1);6-(2);7-(2);8-(X,2);9-(1,2);10-(1,X);11-(1);12-(1);13-(1,2);14-(1);15-(1)',
    '1-(X,2);2-(X,2);3-(2);4-(1);5-(1,X);6-(1,2);7-(X,2);8-(X,2);9-(1,2);10-(X,2);11-(1,X);12-(1,2);13-(2);14-(1);15-(1)'
]
combinations = it.chain.from_iterable([get_combinations(str) for str in strs])
print(find_dupes(combinations))

 
результат

Цитата:
['XX21122X1X11211', 'XX21122X2X11211', 'XX2112221X11211', 'XX2112222X11211', 'XX21X22X1X11211', 'XX21X22X2X11211', 'XX21X2221X11211', 'XX21X2222X11211']

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 11:28 22-09-2022 | Исправлено: Mavrikii, 11:44 22-09-2022
Alex_Piggy

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброе время, Mavrikii, DJMC

Цитата:
что когда строк мало, они делаются за секунду, но когда их 1000

Тысячи строк - это имеется в виду исходных, верно?
Если не нужно количество дубликатов ('XX21122X1X11211' - 4 шт), а только их наличие - то лучше будет зайти с другой стороны. И уменьшить количество наборов, из которых будет строить дубликаты.
Но вменяемо это оформить - мозгов не хватает...
1. Переводим в массив массивов.
2. Берем первый массив. По очереди проходим по его элементам и проверяем - в следующих после него массивах проверяем есть ли такие элементы. Оставляем только те элементы, которые есть. Если элементов нет - этот массив из последующих проверок исключаем.
3. Результатом будет массив массивов из которых строятся дубликаты для первого массива (первой строки). Строим строки и заносим в набор (set).
4. Повторяем для последующих строк по принципу j=i+1
5. Выводим полученный set.

Код:
 
import itertools as it
import re
strs = [  
     '1-(1,X);2-(1,X);3-(2);4-(1,X);5-(X,1);6-(2);7-(2);8-(X,2);9-(1,2);10-(1,X);11-(1);12-(1);13-(1,2);14-(1);15-(1)',
     '1-(1,X);2-(1);3-(2);4-(1);5-(1);6-(2);7-(2);8-(2);9-(1);10-(1);11-(1);12-(1);13-(1);14-(1);15-(1) ',
     '1-(X,2);2-(X,2);3-(2);4-(1);5-(1,X);6-(1,2);7-(X,2);8-(X,2);9-(1,2);10-(X,2);11-(1,X);12-(1,2);13-(2);14-(1);15-(1)',
]
mainArr = []
outSet = set()
for str in strs:
  m = re.findall(r'\((.*?)\)', str)  
  mainArr.append([v.split(',') for v in m])
for  a,b in enumerate(mainArr[:-1]):
  tmpArr = mainArr[a+1:].copy()
  for i in range(0,len(b)):
    for c in tmpArr:
      for d in c[i]:
        if not d in b[i]:
          c[i].remove(d)
      if not c[i]:
        tmpArr.remove(c)
  for e in tmpArr:
    outSet.update([''.join(x) for x in it.product(*e)])
print (outSet)
 

UPD:  Так и количество дубликатов посчитать можно - просто записывать в list, а не set, и затем считать в dict.
UPD2:  
1. Сравниваем первую строку со второй и третьей - получаем
'1-(1,X);2-(1);3-(2);4-(1);5-(1);6-(2);7-(2);8-(2);9-(1);10-(1);11-(1);12-(1);13-(1);14-(1);15-(1) ',
'1-(X);2-(X);3-(2);4-(1);5-(1,X);6-(2);7-(2);8-(X,2);9-(1,2);10-(X);11-(1);12-(1);13-(2);14-(1);15-(1)'
Эти варианты добавляем в set (10 шт).
2. Сравниваем вторую строку с третьей - не получаем ничего
Результат - набор из 10 строк.

Всего записей: 1891 | Зарегистр. 07-08-2002 | Отправлено: 14:20 22-09-2022 | Исправлено: Alex_Piggy, 14:31 22-09-2022
DJMC



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
результат

А сколько у Вас заняло это времени, можно попросить Вас  
проверить этот массив? ..
 
Alex_Piggy
в том то и дело, что мне нужны именно результаты, а не просто количество совпадений.
да имеется ввиду исходные данные.

Цитата:
Результат - набор из 10 строк.

Почему то у Вас получился другой результат, и он не совсем корректный, так как из этих 10 вариантов, два еще имеют дубликаты и должно быть 8 вариантов как и у Mavrikii
 
 
2500 вариантов..

Всего записей: 12258 | Зарегистр. 26-09-2005 | Отправлено: 15:17 22-09-2022 | Исправлено: DJMC, 15:27 22-09-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DJMC

Цитата:
А сколько у Вас заняло это времени, можно попросить Вас  

а сами никак??
можете хоть тут запускать https://www.online-python.com/
получается 18515 вариантов
для слишком большого, конечно же, придется локально.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 21:02 22-09-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
2500 вариантов..

получилось 67272803
список в архиве https://dropmefiles.com/MuV6R
 
в массив сразу записывать не нужно, можно и  

Код:
strs = '''1-(1,X);2-(1,X);3-(2);4-(1,X);5-(X,1);6-(2);7-(2);8-(X,2);9-(1,2);10-(1,X);11-(1);12-(1);13-(1,2);14-(1);15-(1)
1-(1,X);2-(1);3-(2);4-(1);5-(1);6-(2);7-(2);8-(2);9-(1);10-(1);11-(1);12-(1);13-(1);14-(1);15-(1)
1-(X,2);2-(X,2);3-(2);4-(1);5-(1,X);6-(1,2);7-(X,2);8-(X,2);9-(1,2);10-(X,2);11-(1,X);12-(1,2);13-(2);14-(1);15-(1)'''.split("\n")

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 23:39 22-09-2022 | Исправлено: Mavrikii, 23:41 22-09-2022
DJMC



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
получилось 67272803
список в архиве https://dropmefiles.com/MuV6R

Как я понял это просто преобразование файла произошло, без удаление дубликатов, верно? к сожалению данный файл у меня не открывается в текстовом формате, так как весит больше 1 гигабайта.  

Всего записей: 12258 | Зарегистр. 26-09-2005 | Отправлено: 13:06 23-09-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DJMC

Цитата:
к сожалению данный файл у меня не открывается в текстовом формате, так как весит больше 1 гигабайта

Notepad++ (часть 2)
 

Цитата:
Как я понял это просто преобразование файла произошло

просто список дубликатов. без проверки на повторное попадание туда.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 18:39 23-09-2022
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, пожалуйста, возможно ли решение. Сразу замечу, что не программист, немного знаком с JScript и VBScript (скрипты для AkelPad, для файловых менеджеров и так по мелочи), чуть более - AutoIt и Lua. На Python пара-тройка несложных в общем-то скриптов. Давно собирался сделать скрипт перезапуска Double Commander, вышло так:

Код:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import os
import psutil
import signal
import time
 
dcpid = 0
dcfname = ''
 
for p in psutil.process_iter(['pid', 'name']):  
    if p.name() == "doublecmd":
        dcpid = p.pid
        dcfname = p.exe()
        os.kill(p.pid, signal.SIGTERM)
        break
 
cnt = 0
 
while True:
    if cnt > 5:
        break
    if psutil.pid_exists(dcpid):
        cnt = cnt + 1
        time.sleep(1)
    else:
        break
 
if cnt <= 5:
    os.system(dcfname)

(while и условие ниже - на всякий случай, чтобы не ждать до посинения.) Как организовать запуск так, чтобы в диспетчере задач не висели "python script.py" и "sh -c путь-к-doublecmd", а чтобы скрипт завершился и в диспетчере висел только "путь-к-doublecmd" или просто "doublecmd", как при запуске из меню?

Всего записей: 6489 | Зарегистр. 28-01-2008 | Отправлено: 23:55 10-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off

Цитата:
а чтобы скрипт завершился

raise SystemExit()
когда вам нужно завершить скрипт

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 00:37 11-11-2022
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
raise SystemExit()  

Но ведь скрипт ждёт завершения os.system(dcfname)?

Всего записей: 6489 | Зарегистр. 28-01-2008 | Отправлено: 07:22 11-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Skif_off

Цитата:
Но ведь скрипт ждёт завершения os.system(dcfname)?

чего вы хотите добиться?
если скрипт должен ждать - будет висеть.
вам нужно просто убить его и запустить? после запуска должен выходить, заканчивать свое выполнение. 5 секунд ждет если убит, если меньше - запускает, если больше - выходит.
 
раз вы ждете окончания закрытия - будет висеть. не хотите, чтобы висел питон - запускаете командной строкой, питон тогда не будет запущен, но будет та строка.  
 
что именно вы хотите? зачем тут вообще питон?
killall name; name
 
все, сначала убивает, потом запускает.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 07:37 11-11-2022
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
На Python можно много чего попутно сделать, историю почистить, например.
Или иногда нужно переключить интерфейс на английский, а потом обратно, что происходит так: открыть диалог настроек, перейти в раздел Язык, выбрать английский, нажать кнопку Применить, нажать Ок в окне предвереждения о необходимости перезапуска, закрыть окно настроек, закрыть DC, запустить DC, потом всё то же самое, но выбрать обратно русский. Вместо этого можно закрыть DC, в doublecmd.xml заменить значение одного параметра и снова запустить.
 
Хочу, чтобы скрипт запустил Double Commander и сразу завершился, но не нашёл подходящую функцию для этого.

Всего записей: 6489 | Зарегистр. 28-01-2008 | Отправлено: 15:23 11-11-2022
Skif_off

Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Кажется, нашёл решение

Код:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import os
import psutil
import signal
import subprocess
import time
 
def GetPidAndPath():
    rpid = 0
    rfname = ''
    for p in psutil.process_iter(['pid', 'name']):  
        if p.name() == "doublecmd":
            rpid = p.pid
            rfname = p.exe()
            break
    return rpid, rfname
 
dcpid, dcfname = GetPidAndPath()
if dcpid != 0:
    os.kill(dcpid, signal.SIGTERM)
    time.sleep(3)
    dcpid, tf = GetPidAndPath()
    if dcpid == 0:
        subprocess.Popen(dcfname, shell = False)

(На psutil.pid_exists() забил, оно странное.)

Всего записей: 6489 | Зарегистр. 28-01-2008 | Отправлено: 18:11 11-11-2022
DartKane



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет. Сразу прошу не кидаться палками и другими коричневыми массами.
Я делаю некоторые проекты (в основном для себя) в Autoplay Media Studio.
Решил попробовать что-нибудь на питоне сделать. Однако, упёрся в проблему:
Не могу найти ни одного IDE, либо конструктора, где было бы более-менее удобно реализована многостраничность проекта, как это реализовано в том же AMS.
 
Смотрел, как это реализуется в pyqt5 designer и прифигел, как это не удобно и не наглядно. Когда у тебя в проекте 3 страниц - ты будешь путаться.

Всего записей: 71 | Зарегистр. 15-09-2013 | Отправлено: 11:18 14-11-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DartKane
непонятно почему спрашиваете в этой теме. питон это язык программирования, с любыми задачами, которые вы сами для него напишите.
 
если вам нужна какая то узкая конкретика, то это нужно спрашивать в программах, а не в теме по языку.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 11:29 14-11-2022
msmih



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
del

Всего записей: 1192 | Зарегистр. 29-01-2006 | Отправлено: 13:07 01-12-2022 | Исправлено: msmih, 14:06 01-12-2022
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет!
 
Вопрос от чайника
 
Как в python осуществлять поиск по части строки?
 
Поясню. Условно есть справочник: яблоки, груши, арбузы. И есть мастер-таблица, в которой в заголовках столбцов значения: яблоки красные, яблоки зеленые, яблоки желтые, груши круглые и т.д.
Мне надо взять значение из справочника, например "яблоки" и пробежаться с ним по заголовкам мастер-таблицы - то есть необходимо сравнить "яблоки" с "яблоки красные", "яблоки зеленые", "яблоки желтые" и понять что это то, что надо.

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 16:34 13-12-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX

Цитата:
Как в python осуществлять поиск по части строки?


Код:
search = "яблоки"
string = "яблоки зеленые"
 
if search in string:
    print(f"'{search}' найдено в '{string}'")

 
если вариации и тд и тп - регулярное выражение.
если нужно избежать регистр - привести оба значения к одному.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 18:18 13-12-2022
DDDK

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Python 3.11.1 под Win 7 не работает ?????

Всего записей: 147 | Зарегистр. 07-11-2005 | Отправлено: 16:55 21-12-2022
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Python


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru