Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 13

Как за один проход сравнить поля у групп строк, сохраняя подходящие группы?

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

Студворк — интернет-сервис помощи студентам
Имеется файл содержащий строки вида

Code
1
... id "mju85hfn0dfigkd" ... per "0.479286" ...
где значения id могут быть одинаковыми (если они одинаковые, то такие строки идут подряд), тогда нужно проверить, количество этих строк (с одинаковым id) больше ли заданного числа и также имеет ли одна из этих строк значение per больше заданного. Если группа строк удовлетворяет данным требованиям, её нужно скопировать в другой файл.

Проблема в том, что строк в файле может быть сильно больше 300.000, поэтому возникает вопрос как сделать подобный отбор эффективно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.11.2013, 17:29
Ответы с готовыми решениями:

Найти максимальную сумму элементов строк в один проход массива
2) Напишите программу, решающую поставленную задачу в один проход массива. задача:Ищет в двумерном массиве строку, сумма элементов...

Как не сохраняя на диске открыть файл из Blob-поля (mssql)
Привет всем. Появилась необходимость разобраться с сохранением и чтением файлов в БД MS SQL средствами делфей. Разобрался с сохранением...

Как считывать только одно число типа double за один проход
Теперь измените тело цикла так, чтобы он считывал только одно число типа double за один проход. Определите две переменные, чтобы...

20
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.11.2013, 20:48
в любом случае нужно набрать всю группу куда-то, потому что только на последней строке станет ясно, нужно ли группу сохранять
файловый объект, открытый в текстовом режиме, уже разделён на строки и является итератором по ним, поэтому возвраты по файлу будут невозможны

Цитата Сообщение от rivawi Посмотреть сообщение
Проблема в том, что строк в файле может быть сильно больше 300.000
проблема не в том, сколько строк в файле, а в том, сколько строк может быть в одной группе
от этого зависит, сколько она займёт памяти при временном сохранении

крайний случай - весь файл является одной группой; в таком случае лучше по файлу делать возвраты, а для этого нужно будет вручную разделять файл на строки - это долго в плане написания (нужно будет делать свой итератор)
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 13
15.11.2013, 21:31  [ТС]
крайний случай - весь файл является одной группой
Моя ошибка, надо было уточнить, что в данном случае группа не будет превышать 40-50 строк, и то в крайнем случае.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.11.2013, 21:49
давай конкретный пример входного файла и файла результата
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 13
15.11.2013, 22:16  [ТС]
На входе

Code
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
chr14   HAVANA  transcript  106114261   106115394   0.0 -   .   gene_id "ENSG00000211893"; transcript_id "ENST00000497397"; FPKM "0.0000000000"; frac "0.000000"; conf_lo "0.000000"; conf_hi "0.000000"; cov "0.000000"; npIDR "0.719";
chr14   HAVANA  transcript  105952654   105955122   124.823 +   .   gene_id "ENSG00000213145"; transcript_id "ENST00000496700"; FPKM "0.7477725426"; frac "0.041509"; conf_lo "0.000000"; conf_hi "2.069093"; cov "3.521779"; npIDR "0.018";
chr14   HAVANA  transcript  105953204   105955075   442.457 +   .   gene_id "ENSG00000213145"; transcript_id "ENST00000409393"; FPKM "10.6041573404"; frac "0.122343"; conf_lo "5.626934"; conf_hi "15.581380"; cov "49.942319"; npIDR "0.000";
chr14   HAVANA  transcript  105953254   105955128   506.275 +   .   gene_id "ENSG00000213145"; transcript_id "ENST00000392531"; FPKM "22.2179999958"; frac "0.270522"; conf_lo "14.979124"; conf_hi "29.456876"; cov "104.639945"; npIDR "0.000";
chr14   HAVANA  transcript  105953465   105955128   458.940 +   .   gene_id "ENSG00000213145"; transcript_id "ENST00000330233"; FPKM "8.6819630501"; frac "0.109405"; conf_lo "4.163138"; conf_hi "13.200788"; cov "40.889375"; npIDR "0.000";
chr14   HAVANA  transcript  105953534   105955122   0.00328 +   .   gene_id "ENSG00000213145"; transcript_id "ENST00000460900"; FPKM "0.3907268288"; frac "0.013946"; conf_lo "0.000000"; conf_hi "1.345797"; cov "1.840203"; npIDR "0.041";
chr14   HAVANA  transcript  105954191   105955126   168.722 +   .   gene_id "ENSG00000213145"; transcript_id "ENST00000461556"; FPKM "1.6460106584"; frac "0.025749"; conf_lo "0.000000"; conf_hi "3.606194"; cov "7.752204"; npIDR "0.010";
chr14   HAVANA  transcript  105953536   105958976   64.2853 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000477724"; FPKM "0.5760528987"; frac "0.011545"; conf_lo "0.000000"; conf_hi "1.556484"; cov "2.713032"; npIDR "0.029";
chr14   HAVANA  transcript  105956192   105965516   73.9499 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000329886"; FPKM "0.0001925388"; frac "0.000008"; conf_lo "0.000000"; conf_hi "0.021299"; cov "0.000907"; npIDR "0.024";
chr14   HAVANA  transcript  105956200   105958580   8.41705 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000427614"; FPKM "0.0002537682"; frac "0.000003"; conf_lo "0.000000"; conf_hi "0.022217"; cov "0.001195"; npIDR "0.076";
chr14   HAVANA  transcript  105956213   105963780   0.00166 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000455454"; FPKM "0.0005331660"; frac "0.000012"; conf_lo "0.000000"; conf_hi "0.033301"; cov "0.002511"; npIDR "0.719";
chr14   HAVANA  transcript  105956461   105965033   28.6696 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000432805"; FPKM "0.0015832985"; frac "0.000046"; conf_lo "0.000000"; conf_hi "0.058651"; cov "0.007457"; npIDR "0.055";
chr14   HAVANA  transcript  105956520   105965523   9.35626 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000392527"; FPKM "4.1342437148"; frac "0.154346"; conf_lo "1.496167"; conf_hi "6.772320"; cov "19.471016"; npIDR "0.007";
chr14   HAVANA  transcript  105956633   105958940   15.5658 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000443229"; FPKM "0.0005687437"; frac "0.000013"; conf_lo "0.000000"; conf_hi "0.032979"; cov "0.002679"; npIDR "0.076";
chr14   ENSEMBL transcript  105957277   105965584   44.3326 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000392528"; FPKM "0.0368485095"; frac "0.001421"; conf_lo "0.000000"; conf_hi "0.373511"; cov "0.173545"; npIDR "0.041";
chr14   HAVANA  transcript  105957402   105964212   0.00015 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000421892"; FPKM "0.0011750012"; frac "0.000023"; conf_lo "0.000000"; conf_hi "0.048506"; cov "0.005534"; npIDR "0.719";
chr14   ENSEMBL transcript  105957440   105965584   0.47004 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000334656"; FPKM "0.6262478613"; frac "0.021574"; conf_lo "0.000000"; conf_hi "1.651559"; cov "2.949435"; npIDR "0.029";
chr14   HAVANA  transcript  105957571   105959028   23.1797 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000451719"; FPKM "0.3266500798"; frac "0.004196"; conf_lo "0.000000"; conf_hi "1.064515"; cov "1.538421"; npIDR "0.048";
chr14   HAVANA  transcript  105957583   105965585   61.7473 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000392523"; FPKM "0.7076338251"; frac "0.035184"; conf_lo "0.000000"; conf_hi "1.793505"; cov "3.332738"; npIDR "0.024";
chr14   ENSEMBL transcript  105957586   105965584   0.08684 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000334643"; FPKM "0.0002695414"; frac "0.000011"; conf_lo "0.000000"; conf_hi "0.023933"; cov "0.001269"; npIDR "0.719";
chr14   ENSEMBL transcript  105957586   105965584   163.295 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000392522"; FPKM "3.9620955606"; frac "0.172540"; conf_lo "1.388805"; conf_hi "6.535386"; cov "18.660251"; npIDR "0.009";
chr14   HAVANA  transcript  105957599   105959054   8.27261 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000460959"; FPKM "0.2022057727"; frac "0.003768"; conf_lo "0.000000"; conf_hi "0.782871"; cov "0.952327"; npIDR "0.055";
chr14   HAVANA  transcript  105957628   105965546   173.681 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000354560"; FPKM "0.0009508065"; frac "0.000037"; conf_lo "0.000000"; conf_hi "0.047778"; cov "0.004478"; npIDR "0.008";
chr14   HAVANA  transcript  105957663   105963750   55.9885 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000463869"; FPKM "0.1546125409"; frac "0.003283"; conf_lo "0.000000"; conf_hi "0.662457"; cov "0.728178"; npIDR "0.040";
chr14   HAVANA  transcript  105957731   105965283   103.366 +   .   gene_id "ENSG00000185347"; transcript_id "ENST00000450383"; FPKM "0.3018965484"; frac "0.008517"; conf_lo "0.000000"; conf_hi "1.011388"; cov "1.421840"; npIDR "0.015";
chr14   HAVANA  transcript  106138648   106139651   0.0 -   .   gene_id "ENSG00000213140"; transcript_id "ENST00000392510"; FPKM "0.0000000000"; frac "0.000000"; conf_lo "0.000000"; conf_hi "0.000000"; cov "0.000000"; npIDR "0.719";
chr14   ENSEMBL transcript  105886157   105930900   0.77335 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000435036"; FPKM "0.0290338622"; frac "0.000356"; conf_lo "0.000000"; conf_hi "0.397936"; cov "0.146411"; npIDR "0.719";
chr14   ENSEMBL transcript  105886157   105937020   210.259 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000418661"; FPKM "0.0492127612"; frac "0.001090"; conf_lo "0.000000"; conf_hi "0.605317"; cov "0.248168"; npIDR "0.008";
chr14   ENSEMBL transcript  105886157   105937020   2.00602 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000414153"; FPKM "0.0157961538"; frac "0.000357"; conf_lo "0.000000"; conf_hi "0.295205"; cov "0.079656"; npIDR "0.719";
chr14   HAVANA  transcript  105886159   105937066   16.1814 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000331320"; FPKM "0.9159612428"; frac "0.020856"; conf_lo "0.000000"; conf_hi "3.539628"; cov "4.618977"; npIDR "0.020";
chr14   HAVANA  transcript  105886229   105937066   85.6077 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000406191"; FPKM "3.9360016105"; frac "0.086434"; conf_lo "0.000000"; conf_hi "8.154828"; cov "19.848332"; npIDR "0.000";
chr14   HAVANA  transcript  105886275   105937066   346.182 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000405646"; FPKM "14.4331130725"; frac "0.310237"; conf_lo "6.410642"; conf_hi "22.455584"; cov "72.782799"; npIDR "0.000";
chr14   HAVANA  transcript  105886353   105936575   221.316 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000438610"; FPKM "4.9659990467"; frac "0.086496"; conf_lo "0.343032"; conf_hi "9.588966"; cov "25.042367"; npIDR "0.008";
chr14   HAVANA  transcript  105888308   105916653   31.5076 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000485203"; FPKM "0.1781527138"; frac "0.000869"; conf_lo "0.000000"; conf_hi "1.042969"; cov "0.898382"; npIDR "0.055";
chr14   HAVANA  transcript  105905009   105929568   147.040 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000481012"; FPKM "2.1255623305"; frac "0.015883"; conf_lo "0.000000"; conf_hi "5.142407"; cov "10.718712"; npIDR "0.012";
chr14   HAVANA  transcript  105905052   105927137   113.014 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000424723"; FPKM "0.4024002100"; frac "0.002791"; conf_lo "0.000000"; conf_hi "1.703394"; cov "2.029210"; npIDR "0.012";
chr14   HAVANA  transcript  105915380   105924708   132.299 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000494026"; FPKM "1.1724865037"; frac "0.007436"; conf_lo "0.000000"; conf_hi "3.393622"; cov "5.912574"; npIDR "0.009";
chr14   HAVANA  transcript  105915577   105927290   108.345 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000498644"; FPKM "0.7273565663"; frac "0.004967"; conf_lo "0.000000"; conf_hi "2.634397"; cov "3.667888"; npIDR "0.015";
chr14   HAVANA  transcript  105924681   105937066   418.724 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000434050"; FPKM "13.3436458247"; frac "0.213381"; conf_lo "5.642323"; conf_hi "21.044968"; cov "67.288871"; npIDR "0.014";
chr14   HAVANA  transcript  105927218   105931520   221.378 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000490198"; FPKM "1.2787577470"; frac "0.007987"; conf_lo "0.000000"; conf_hi "3.590236"; cov "6.448475"; npIDR "0.006";
chr14   HAVANA  transcript  105932857   105933529   249.700 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000469140"; FPKM "5.4226437361"; frac "0.021076"; conf_lo "0.643760"; conf_hi "10.201528"; cov "27.345119"; npIDR "0.000";
chr14   HAVANA  transcript  105934446   105936544   404.365 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000426567"; FPKM "4.7623209725"; frac "0.020632"; conf_lo "0.230629"; conf_hi "9.294013"; cov "24.015266"; npIDR "0.000";
chr14   HAVANA  transcript  105935312   105936567   347.211 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000481206"; FPKM "10.5588854462"; frac "0.067415"; conf_lo "3.879235"; conf_hi "17.238536"; cov "53.245979"; npIDR "0.009";
chr14   HAVANA  transcript  105935406   105936634   433.934 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000494981"; FPKM "21.0522169931"; frac "0.083919"; conf_lo "11.343319"; conf_hi "30.761115"; cov "106.161385"; npIDR "0.000";
chr14   HAVANA  transcript  105935804   105936575   456.423 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000481635"; FPKM "9.0158525329"; frac "0.047818"; conf_lo "2.749515"; conf_hi "15.282190"; cov "45.464827"; npIDR "0.000";


На выходе (нужное нам id - gene_id, отсеивание по количеству строк > 5 и по значению frac > 0.31)

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
chr14   ENSEMBL transcript  105886157   105930900   0.77335 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000435036"; FPKM "0.0290338622"; frac "0.000356"; conf_lo "0.000000"; conf_hi "0.397936"; cov "0.146411"; npIDR "0.719";
chr14   ENSEMBL transcript  105886157   105937020   210.259 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000418661"; FPKM "0.0492127612"; frac "0.001090"; conf_lo "0.000000"; conf_hi "0.605317"; cov "0.248168"; npIDR "0.008";
chr14   ENSEMBL transcript  105886157   105937020   2.00602 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000414153"; FPKM "0.0157961538"; frac "0.000357"; conf_lo "0.000000"; conf_hi "0.295205"; cov "0.079656"; npIDR "0.719";
chr14   HAVANA  transcript  105886159   105937066   16.1814 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000331320"; FPKM "0.9159612428"; frac "0.020856"; conf_lo "0.000000"; conf_hi "3.539628"; cov "4.618977"; npIDR "0.020";
chr14   HAVANA  transcript  105886229   105937066   85.6077 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000406191"; FPKM "3.9360016105"; frac "0.086434"; conf_lo "0.000000"; conf_hi "8.154828"; cov "19.848332"; npIDR "0.000";
chr14   HAVANA  transcript  105886275   105937066   346.182 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000405646"; FPKM "14.4331130725"; frac "0.310237"; conf_lo "6.410642"; conf_hi "22.455584"; cov "72.782799"; npIDR "0.000";
chr14   HAVANA  transcript  105886353   105936575   221.316 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000438610"; FPKM "4.9659990467"; frac "0.086496"; conf_lo "0.343032"; conf_hi "9.588966"; cov "25.042367"; npIDR "0.008";
chr14   HAVANA  transcript  105888308   105916653   31.5076 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000485203"; FPKM "0.1781527138"; frac "0.000869"; conf_lo "0.000000"; conf_hi "1.042969"; cov "0.898382"; npIDR "0.055";
chr14   HAVANA  transcript  105905009   105929568   147.040 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000481012"; FPKM "2.1255623305"; frac "0.015883"; conf_lo "0.000000"; conf_hi "5.142407"; cov "10.718712"; npIDR "0.012";
chr14   HAVANA  transcript  105905052   105927137   113.014 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000424723"; FPKM "0.4024002100"; frac "0.002791"; conf_lo "0.000000"; conf_hi "1.703394"; cov "2.029210"; npIDR "0.012";
chr14   HAVANA  transcript  105915380   105924708   132.299 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000494026"; FPKM "1.1724865037"; frac "0.007436"; conf_lo "0.000000"; conf_hi "3.393622"; cov "5.912574"; npIDR "0.009";
chr14   HAVANA  transcript  105915577   105927290   108.345 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000498644"; FPKM "0.7273565663"; frac "0.004967"; conf_lo "0.000000"; conf_hi "2.634397"; cov "3.667888"; npIDR "0.015";
chr14   HAVANA  transcript  105924681   105937066   418.724 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000434050"; FPKM "13.3436458247"; frac "0.213381"; conf_lo "5.642323"; conf_hi "21.044968"; cov "67.288871"; npIDR "0.014";
chr14   HAVANA  transcript  105927218   105931520   221.378 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000490198"; FPKM "1.2787577470"; frac "0.007987"; conf_lo "0.000000"; conf_hi "3.590236"; cov "6.448475"; npIDR "0.006";
chr14   HAVANA  transcript  105932857   105933529   249.700 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000469140"; FPKM "5.4226437361"; frac "0.021076"; conf_lo "0.643760"; conf_hi "10.201528"; cov "27.345119"; npIDR "0.000";
chr14   HAVANA  transcript  105934446   105936544   404.365 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000426567"; FPKM "4.7623209725"; frac "0.020632"; conf_lo "0.230629"; conf_hi "9.294013"; cov "24.015266"; npIDR "0.000";
chr14   HAVANA  transcript  105935312   105936567   347.211 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000481206"; FPKM "10.5588854462"; frac "0.067415"; conf_lo "3.879235"; conf_hi "17.238536"; cov "53.245979"; npIDR "0.009";
chr14   HAVANA  transcript  105935406   105936634   433.934 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000494981"; FPKM "21.0522169931"; frac "0.083919"; conf_lo "11.343319"; conf_hi "30.761115"; cov "106.161385"; npIDR "0.000";
chr14   HAVANA  transcript  105935804   105936575   456.423 +   .   gene_id "ENSG00000182979"; transcript_id "ENST00000481635"; FPKM "9.0158525329"; frac "0.047818"; conf_lo "2.749515"; conf_hi "15.282190"; cov "45.464827"; npIDR "0.000";
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.11.2013, 23:40
прежняя версия (неправильная)
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/env python3
 
import re
 
ifname = 'file.txt'
ofname = 'output.txt'
 
pat1 = re.compile(r'gene_id "([^"]+)"')
pat2 = re.compile(r'frac "([^"]+)"')
 
def q1(s1, s2):
    if s1 and s2:
        return pat1.search(s1).group(1) == \
               pat1.search(s2).group(1)
    else:
        return False
 
def q2(s, v):
    return float(pat2.search(s).group(1)) > v
 
def q3(lst, n):
    return len(lst) > n
 
def filt(fin, fout):
    v = 0.31
    n = 5
    lst, p, q = [], '', False
    for x in fin:
        if q1(x, p):
            if not lst:
                lst.append(p)
            lst.append(x)
            if q2(x, v):
                q = True
        elif lst:
            if q:
                if q3(lst, n):
                    fout.writelines(lst)
                q = False
            lst = []
        p = x
    if q and q3(lst, n):
        fout.writelines(lst)
 
with open(ifname, encoding='utf-8') as fin, \
     open(ofname, 'w', encoding='utf-8') as fout:
    filt(fin, fout)


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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/env python3
 
import re
 
pat1 = re.compile(r'gene_id "([^"]+)"')
pat2 = re.compile(r'frac "([^"]+)"')
 
def q1(s1, s2):
    if s1 and s2:
        return pat1.search(s1).group(1) == \
               pat1.search(s2).group(1)
    else:
        return False
 
def q2(s, v):
    return float(pat2.search(s).group(1)) > v
 
def q3(lst, n):
    return len(lst) > n
 
def filt(fin, fout, conds):
    n, v = conds
    lst, p, q = [], '', False
    for x in fin:
        if q1(x, p):
            lst.append(p)
            if q2(x, v):
                q = True
        else:
            if q and q3(lst, n - 1):
                lst.append(p)
                fout.writelines(lst)
            lst, q = [], q2(x, v)
        p = x
    if q and q3(lst, n - 1):
        lst.append(p)
        fout.writelines(lst)
 
if __name__ == '__main__':
    ifname = 'file.txt'
    ofname = 'output.txt'
    with open(ifname, encoding='utf-8') as fin, \
         open(ofname, 'w', encoding='utf-8') as fout:
        filt(fin, fout, (5, 0.31))
1
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 13
16.11.2013, 00:12  [ТС]
Судя по тестовому файлу все работает замечательно.
Большое спасибо!
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
16.11.2013, 05:30
Цитата Сообщение от rivawi Посмотреть сообщение
Судя по тестовому файлу все работает замечательно.
не, косяк там, сделал тесты, он и проявился
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 13
16.11.2013, 12:13  [ТС]
Рано радовался?
Вообще странно, последняя версия кода вроде тестовый скушала и выдала то что нужно...

А в чем косяк?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.11.2013, 08:46
Цитата Сообщение от rivawi Посмотреть сообщение
А в чем косяк?
он редко проявляется: короче, если в первой строке группы есть нужная фракция, а в остальных нет, то группа не видна

обновил там версию

Добавлено через 2 минуты
я, короче, после того как сделал, чтобы тесты проходили, переписал всё сначала на генератор, чтобы можно было подать поток строк и получить поток строк, а потом переписал всё на itertools, получилось короче, а по скорости - то же самое

Добавлено через 1 час 34 минуты
это через генератор
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python3
 
import re
 
pat1 = re.compile(r'gene_id "([^"]+)"')
pat2 = re.compile(r'frac "([^"]+)"')
 
def q1(s1, s2):
    if s1 and s2:
        return pat1.search(s1).group(1) == \
               pat1.search(s2).group(1)
    else:
        return False
 
def q2(s, v):
    return float(pat2.search(s).group(1)) > v
 
def q3(lst, n):
    return len(lst) > n
 
def filt(seq, conds):
    n, v = conds
    lst, p, q = [], '', False
    for x in seq:
        if q1(x, p):
            lst.append(p)
            if q2(x, v):
                q = True
        else:
            if q and q3(lst, n - 1):
                for i in lst:
                    yield i
                yield p
            lst, q = [], q2(x, v)
        p = x
    if q and q3(lst, n - 1):
        for i in lst:
            yield i
        yield p
 
if __name__ == '__main__':
    ifname = 'file.txt'
    ofname = 'output.txt'
    with open(ifname, encoding='utf-8') as fin, \
         open(ofname, 'w', encoding='utf-8') as fout:
        fout.writelines(filt(fin, (5, 0.31)))


это через генератор и itertools
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
25
26
27
28
29
#!/usr/bin/env python3
 
# находит группы строк с одинаковым полем gene_id,
# если у них поле frac больше заданного значения и
# количество строк в группе больше заданного числа
 
import itertools
import re
 
pat1 = re.compile(r'gene_id "([^"]+)"')
pat2 = re.compile(r'frac "([^"]+)"')
 
def filt(seq, conds):
    n, v = conds
    gifld = lambda s: pat1.search(s).group(1)
    for i in itertools.groupby(seq, gifld):
        grp = tuple(i[1])
        if len(grp) > n and \
           any(float(pat2.search(s).group(1)) > v
               for s in grp):
            for i in grp:
                yield i
 
if __name__ == '__main__':
    ifname = 'file.txt'
    ofname = 'output.txt'
    with open(ifname, encoding='utf-8') as fin, \
         open(ofname, 'w', encoding='utf-8') as fout:
        fout.writelines(filt(fin, (5, 0.31)))

по скорости они равны

Добавлено через 8 часов 16 минут
Code
1
2
3
4
5
6
[guest@localhost timecmp]$ ./timecmp.py 
[0.3141898510000374, 0.3099464500000977, 0.3089516200000162]
[0.0282545800000662, 0.028095027000063055, 0.028291950000038923]
[0.25109581700007766, 0.2509955450000234, 0.2538057570000092]
[0.028762450000158424, 0.02883479700017233, 0.02863113900002645]
[guest@localhost timecmp]$
1 - индукция с файлами
2 - индукция с генератором
3 - itertools с файлами
4 - itertools с генератором

Добавлено через 1 минуту
проверки n и v поменял местами, чтобы не искать в строках фракцию, если их количество уже не подходит
1
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 13
25.11.2013, 03:36  [ТС]
Не знаю, создавать ли отдельную тему, т.к. следующий вопрос связан с этим...

В полученных после обработки файлах нужно найти одинаковые группы строк все по тем же gene_id, и если есть совпадение скопировать эти группы в отдельные файлы. Если мы сравниваем два файла, то тут можно взять и просто читать из первого все gene_id подряд и искать совпадение во втором, если есть = копируем строки с совпадением из второго файла в новый. Но тут начинаются проблемы - группы с одинаковыми gene_id могут иметь разное количество строк в разных файлах. Что вроде бы решается, если считывая следующий gene_id из первого файла мы сравниваем его с предыдущим и исключаем повторы. Но если нам нужно сравнить 3-4 файла разом?

Считать их можно попросту из той же директории где лежит наша программа...

Python
1
2
3
os.getcwd()
directory = os.path.abspath(os.curdir)
fileList = glob.glob('*.txt')
Но вот как корректно сравнить их и сделать для каждого файл с совпадениями именно из него... Я не представляю...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.11.2013, 20:20
Цитата Сообщение от rivawi Посмотреть сообщение
В полученных после обработки файлах нужно найти одинаковые группы строк все по тем же gene_id, и если есть совпадение скопировать эти группы в отдельные файлы.
одинаковые группы - это те, у которых одинаковые gene_id, а остальные поля могут различаться ?
у одинаковых групп может быть разное количество строк ?
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 13
25.11.2013, 21:00  [ТС]
Да, все именно так. Именно поэтому их и понадобилось копировать отдельно для каждого файла.
(соответственно если хоть в одном файле такого gene_id нет, то эту группу мы не копируем)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.11.2013, 21:24
что мешает просто склеить все файлы в один и разделить все разные группы в нём по разным файлам?
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 13
25.11.2013, 21:33  [ТС]
т.е. собираем все файлы в один, затем проверяем, чтобы каждая группа одинаковых gene_id повторялся столько раз - сколько было склеено файлов, затем удаляем не удовлетворяющие этому условию и разделяем файлы назад?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.11.2013, 21:49
не,
1. все файлы склеиваются в один поток строк
2. для каждой строки:
2.1. выделяется поле
2.2. по полю составляется имя файла
2.3. если файла нет, он создаётся
2.4. строка пишется в файл
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 13
25.11.2013, 21:54  [ТС]
Ох, а такую штуку я просто не знаю как написать.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.11.2013, 22:51
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python3
 
import re
import glob
 
pat = re.compile(r'gene_id "([^"]+)"')
mask = 'input*.txt'
fmt = '{}.txt'
 
def cat(seq, enc='utf-8'):
    for fname in seq:
        with open(fname, encoding=enc) as fin:
            for line in fin:
                yield line
 
def getfield(s):
    match = pat.search(s)
    return match and match.group(1)
 
for line in cat(glob.glob(mask)):
    fname = fmt.format(getfield(line))
    with open(fname, 'a', encoding='utf-8') as fout:
        fout.write(line)
1
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 13
25.11.2013, 23:57  [ТС]
И на выходе мы получаем по файлу для каждого соответствия, что очень удобно, когда нужно глазами посмотреть места где произошли совпадения и сравнить их... и все благодаря моей идиотской формулировке...

имелось в виду, что для каждого input файла создается один файл в котором из него остаются только те группы которые имеют gene_id, который встречаются во всех других input файлах...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
26.11.2013, 00:16
Цитата Сообщение от rivawi Посмотреть сообщение
имелось в виду, что для каждого input файла создается один файл в котором из него остаются только те группы которые имеют gene_id, который встречаются во всех других input файлах...
тогда другой алгоритм
1. составить множество общих полей для всех файлов
1.1. для каждого файла:
1.1.1. составить множество полей файла
1.2. найти пересечение всех множеств
2. для каждого файла:
2.1. получить имя выходного файла на основе имени файла
2.2. записать строки с полями, входящими во множество общих полей, в выходной файл
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2013, 00:16
Помогаю со студенческими работами здесь

Поведение групп jsp страниц как некой единой функциональной группы
Всем доброго времени суток. Есть ли возможность обеспечить поведение групп jspстраниц как некой единой функциональной группы? Скажем...

В динамическом списке номенклатуры при открытии группы видеть товары этой группы и товары всех вложенных групп
Доброго времени суток! Начинаю изучать 1с и возникают вопросы по работе. Возможно ли вообще в динамическом списке номенклатуры 1с 8.3...

Как загрузить данные из базы данных сохраняя переносы строк?
Т.е. в базе данных текстовые поля(TEXT), там переносы на новую строку есть и можно даже посмотреть это при открытии таблицы. myphpadmin...

Как за один проход по массиву найти 2 наименьших элемента и их индексы без того чтобы сортировать массив?
int arr = {4,5,1,5,-2,-3,-27}; int a=arr; int b=arr; int aIndex=0; int bIndex=0; for (int i=0; i<7; i++) ...

Как из множества пар точек, которые в конечном счёте образуют несколько групп, получить эти группы?
Имеются пары точек (например 10 пар, см. рис): A1 A8 A13 A9 A2 A10 ....... Как видно из рисунка, все эти точки образуют три...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru