Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6805[/thread]

sortieren eines hash/arrays: datensatz in hash/array sortieren

Leser: 1


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Gast Gast
 2005-03-20 03:48
#52803 #52803
Hallo,

versuche derzeit vergeblich daten zu sortieren
Beispieldatensatz:
zahlx wertA wertB
zahl1 wert1.1 wert100
zahl2 wert1.1 wert80
zahl3 wert1.0 wert10

zahlx ist eindeutig und kann/sollte als key verwendet werden für eine weiterverarbeitung

wertA und wertB sind jeweils zahlen

was mir nicht gelingt ist die daten so zu sortieren, dass zunächst nach spalte 2 sortiert wird und bei gleich großem wert spalte 3 mit einbezogen wird das ergebnis von oben sollte dann sortiert so aussehen: zahl3 vor zahl1 vor zahl2

oder geht das nicht, wie würde man dann nur nach spalte 2 sortieren?
in welche strukur bringt man die daten am besten?
mit %h=>{zahl1}=>{wertA}=wertB; oder %h=>{zahl1}= [ wertA, wertB]; war ich bisher wenig erfolgreich
pq
 2005-03-20 11:12
#52804 #52804
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
in welcher struktur liegen denn die werte vor? was hast du bis
jetzt versucht? kennst du perldoc -f sort und perldoc -q sort?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
guybrush
 2005-03-20 16:50
#52805 #52805
User since
2005-03-20
3 Artikel
BenutzerIn
[default_avatar]
also derzeit liegen die daten in einer textdatei

ich werde mir die dokumentation nochmals genau durcharbeiten, vielleicht hab ich bisher das notwendige nur übersehen :)

als workaround habe ich ein neues hash erstellt
%h{zahl1}=>wertA und habe einmal nur nach wertA sortiert ... besser als nichts ist es allesmal ;)

bei der ursprünglichen form %h{zahl1}=>{wertA}=wertB ist mir ein sortieren überhaupt nicht gelungen (nicht einmal nur nach wertB), da ich noch nicht durschaut habe wie da die syntax lauten müsste
pq
 2005-03-20 17:18
#52806 #52806
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
deine struktur ist denkbar ungünstig zum sortieren. wenn zahlx eindeutig
ist, warum nimmst du denn dann einen hash of hashes?
und natürlich kann perl nach mehreren werten sortieren. du kannst
sort() mit einer beliebigen funktion füttern.
beispiel eines arrays of arrays, und du willst nach index 1 und dann
index 2 sortieren:
my @sorted = sort {
   $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2]
 } @array;
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
guybrush
 2005-03-20 18:59
#52807 #52807
User since
2005-03-20
3 Artikel
BenutzerIn
[default_avatar]
vermutlich denke ich wieder zu kompliziert und ein hash of hashes ist overkill
bzw denkbar ungünstig ...
die frage ist nur wie man die daten sinvoll einlesen sollte um sie am einfachsten zu sortieren
pq
 2005-03-20 19:09
#52808 #52808
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
na so zum beispiel:
while (<FH>) {
 push @array, [split /\s+/, $_];
}
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Taulmarill
 2005-03-21 11:43
#52809 #52809
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
mein vorschlag währe ein hash of arrays (da zahlx ja als key verwendet werden sollte).
Code: (dl )
1
2
3
4
while (<FH>) {
my ($zahl, $werta, $wertb) = split;
$hash{$zahl} = [ $werta, $wertb ];
}


vorteil: das sortieren nach zahlx ist einfacher/schneller
nachteil: das sortieren nach werta/wertb ist langsamer/aufwendiger.\n\n

<!--EDIT|Taulmarill|1111398341-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2005-03-21 18:06
#52810 #52810
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Zur Not kann man ja mehrere Hashes aufbauen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2005-03-21 18:07
#52811 #52811
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ja, mehrere hashes könnten sinn machen, wenn man oft nach keys zugreifen bzw. oft sortieren muss...
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2005-03-22 13:06
#52812 #52812
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Und / oder wenn die Daten so groß sind, dass ein paar weitere Hashes mit Referenzen auf die Daten kaum ins Gewicht fallen. Damit kann man manchmal gewaltig Zeit und Aufwand sparen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2005-03-20 03:48.