abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 02:20 | Zajímavý článek

David Revoy, autor open source webového komiksu Pepper&Carrot nebo portrétu GNU/Linuxu, upozorňuje na svém blogu, že nový Inkscape 0.92 rozbíjí dokumenty vytvořené v předchozích verzích Inkscape. Problém by měl být vyřešen v Inkscape 0.92.2 [reddit].

Ladislav Hagara | Komentářů: 0
dnes 02:02 | Komunita

Øyvind Kolås, hlavní vývojář grafických knihoven GEGL a babl, které využívá grafický program GIMP, žádá o podporu na Patreonu. Díky ní bude moci pracovat na vývoji na plný úvazek. Milník 1000 $, který by stačil na holé přežití, se již téměř podařilo vybrat, dalším cílem je dosažení 2500 $, které mu umožní běžně fungovat ve společnosti.

xkomczax | Komentářů: 10
včera 23:54 | Pozvánky

DevConf.cz 2017, již devátý ročník jedné z největších akcí zaměřených na Linux a open source ve střední Evropě, proběhne od pátku 27. ledna do neděle 29. ledna v prostorách Fakulty informačních technologií Vysokého učení technického v Brně. Na programu je celá řada zajímavých přednášek a workshopů. Letos je povinná registrace.

Ladislav Hagara | Komentářů: 0
včera 22:11 | Nová verze

Byla vydána verze 1.0.0 emulátoru terminálu Terminology postaveného nad EFL (Enlightenment Foundation Libraries). Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
20.1. 17:00 | Nová verze

Byl vydán Docker 1.13. Přehled novinek na YouTube a v poznámkách k vydání na GitHubu. Docker umožňuje běh aplikací v softwarových kontejnerech (Wikipedia).

Ladislav Hagara | Komentářů: 4
20.1. 15:51 | Komunita

Mozilla.cz informuje, že nástroje pro webové vývojáře se možná oddělí od Firefoxu a stanou doplňkem. Nástroje pro webové vývojáře prošly velkým přepisem a tým, který se stará o jejich vývoj, by uvítal možnost jejich častějších aktualizacích nezávisle na vydávání nových verzí Firefoxu.

Ladislav Hagara | Komentářů: 8
20.1. 07:00 | Humor

Čtenářům AbcLinuxu vše nejlepší k dnešnímu Dni zvýšení povědomí o tučňácích (Penguin Awareness Day).

Ladislav Hagara | Komentářů: 0
20.1. 06:00 | Komunita

Bylo spuštěno hlasování o přednáškách a workshopech pro letošní InstallFest, jenž proběhne o víkendu 4. a 5. března v Praze. Současně byla oznámena změna místa. InstallFest se letos vrací zpět na Karlovo náměstí do budovy E.

Ladislav Hagara | Komentářů: 0
20.1. 02:48 | Komunita

Greg Kroah-Hartman potvrdil, že Linux 4.9 je jádrem s prodlouženou upstream podporou (LTS, Long Term Support). Podpora je plánována do ledna 2019. Aktuální jádra s prodlouženou podporou jsou tedy 3.2, 3.4, 3.10, 3.12, 3.16, 3.18, 4.1, 4.4 a 4.9.

Ladislav Hagara | Komentářů: 0
20.1. 00:11 | Zajímavý článek

Výrobce síťových prvků, společnost Netgear, spustila nový program, který slibuje vývojářům, expertům, ale i běžným uživatelům vyplacení finanční odměny za nalezení bezpečnostních chyby v jejich produktech. Za nalezení zranitelnosti v hardware, API nebo mobilní aplikaci nabízí odměnu od 150 do 15 tisíc dolarů (dle závažnosti).

Michal Makovec | Komentářů: 0
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (10%)
 (2%)
 (74%)
 (3%)
 (10%)
Celkem 359 hlasů
 Komentářů: 25, poslední včera 13:34
Rozcestník
Reklama

Dotaz: Perl - Pole a třídění

27.11.2010 14:38 Radek Podskubka | skóre: 2
Perl - Pole a třídění
Přečteno: 342×
Ahoj, potřebuju v perlu seřadit nějaké hodnoty za tím účelem, abych mohl určit jejich medián. Problém je v tom, že k těmto hodnotám přísluší ještě nějaké odchylky. Data ukládám do pole z texťáku, kde jsou v jednom sloupci hodnoty a ve druhém jejich chyby. A medián určuju pro jednotlivé dny (tedy v prvním sloupci figuruje ještě nějaké datum, ale to není podstatné, navíc je to vidět z kódu). V přiložený kód funguje dobře, v podstatě jen určuje medián příslušných hodnot. Ovšem já bych potřeboval do výstupu ještě k mediánu vytisknout odchylku, která k němu přísluší (tedy NE medián odchylek). Problém tedy nastává v okamžiku, kdy se provádí příkaz
@vars = sort @{$dailyvars{$_}};
Pokud bych měl tedy uloženy odchylky v podobném poli jako hodnoty, a tímto způsobem zamíchám s jejich pořadím,tak už nepřísluší například pátý prvek pole vars k pátému prvku pole odchylek. Principielně je snad řešení snadné, prostě kromě hodnot je třeba naskládat do pole @{dailyvars{1}} ještě odkazy na konkrétní prvky pole odchylek a na ty se potom odvolávat. Já jsem ale v Perlu doccela nováček a netuším jak tohle zapsat nebo mě nenapadá nějaké snažší řešení. Děkuji za každou radu.

Celý výpis kódu je zde
while (<>)
{
    if (/^#/) { next; }
    /([\d-]+) (\d+) ([\d\.]+) ([\d\.]+)/ or die "daily_median.pl: Error processing line: $_";
    if (! exists $dailyvars{$1}) { @{$dailyvars{$1}} = ( $3 ); $count{$1} = 1; }
    else { push @{$dailyvars{$1}}, $3; $count{$1} += 1; }
}
foreach (sort keys %dailyvars)
{
    @vars = sort @{$dailyvars{$_}};
    $n = $#vars + 1;
    if ($n % 2 == 1) {
	$median = $vars[($n - 1) / 2]; }
    else {
	$median = ($vars[$n / 2] + $vars[$n / 2 - 1]) / 2; }
    print $_ . " $median " . $count{$_} . "\n";
}

Řešení dotazu:


Odpovědi

Řešení 2× (Radek Podskubka (tazatel), pht)
27.11.2010 15:42 buff | skóre: 10 | blog: buff
Rozbalit Rozbalit vše Re: Perl - Pole a třídění
Myslím, že Tvé řešení je špatně: sort v perlu defaultně třídí lexikograficky, nikoliv číselně.

K problému: pokud by při načítání byla odchylka např. v $4:
if (! exists $dailyvars{$1}) { @{$dailyvars{$1}} = ({var => $3, odchylka => $4}); $count{$1} = 1; }
else { push @{$dailyvars{$1}}, {var => $3, odchylka => $4}; $count{$1} += 1; }

...

@vars = sort { $a->{var} <=> $b->{var} } (@{$dailyvars{$_}});

...

$median = $vars[($n - 1) / 2]->{var};

A další změny analogicky.

Vtip je v tom, že do $dailyvars{$den} neukládáš jen hodnoty, ale ukazatele na hash, který má dva klíče: var a odchylka. Tím si podržíš ty přidružené hodnoty pospolu.

Doufám, že je to trochu srozumitelné, spěchám, tak to vysvětluju tak nějak narychlo a ne moc exaktně. Podívej se do manuálu na sort, tam uvidíš, že to, co dávám do prvních složených závorek, je funkce, která určuje, podle čeho se bude třídit.
27.11.2010 17:16 Radek Podskubka | skóre: 2
Rozbalit Rozbalit vše Re: Perl - Pole a třídění
Dík moc. To je určitě velmi efektivní řešení. Pomohlo mi to.
wamba avatar 27.11.2010 18:16 wamba | skóre: 37 | blog: wamba
Rozbalit Rozbalit vše Re: Perl - Pole a třídění

popř. něco takového

use 5.010;
use warnings;
use strict;

my %dailyvars;

while (<>) {
next if /^#/;    #ignoruj komentáře
/(?<date>[\d-]+) \d+ (?<var>[\d\.]+) (?<odchylka>[\d\.]+)/ #rozeber řádek
or die "daily_median.pl: Error processing line: $_";

push @{ $dailyvars{ $+{date} }{vars} },
$+{var};    #přidej hodnotu mezi hodnoty
push @{ $dailyvars{ $+{date} }{'odchylky'} },
$+{odchylka};    #přidej odchylku mezi odchylky
$dailyvars{ $+{date} }{count}++;    #přičti k počtu 1
}

foreach ( sort keys %dailyvars ) {      #pro všechny  dny (seřazené)
my $median;
my @vars = sort { $a <=> $b } @{ $dailyvars{$_}{vars} };  #srovnej hodnoty
my $n = @vars;                                            #počet  hodnot;

if ( $n % 2 == 1 ) {
$median = $vars[ ( $n - 1 ) / 2 ]
;    #vypočti median pro  sudý počet hondot
}
else {
$median = ( $vars[ $n / 2 ] + $vars[ $n / 2 - 1 ] )
/ 2;    #vypočti median pro lichý počet hodnot
}

#vypiš výsledek
say $_
. "\tmedian: $median "
. "\tpocet: $dailyvars{$_}{count} "
. "\todchylky:  @{ $dailyvars{$_}{odchylky} }";
}

This would have been so hard to fix when you don't know that there is in fact an easy fix.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.