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

In "grep" ZWEI Bedingungen erfüllen (Seite 2)

Leser: 2


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
PerlProfi
 2007-04-20 22:04
#76094 #76094
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Sorry habs grad mal getestet, sind noch ein paar Fehler drin, am Anfang die foreach-Schleife, da hatte ich erst was mit for und hab dann $i drin gelassen, und am Ende das splice, gleich poste ich nochmal den korrekten code, mit Beispiel.
Meo
 2007-04-20 22:16
#76095 #76095
User since
2007-04-20
12 Artikel
BenutzerIn
[default_avatar]
also...

einen Output habe ich nun mal schon, aber die doppelten werden noch nicht entfernt. Es soll ja nur das 6 (letzte) Element verglichen werden. Muss ich da noch was in Deinen Code nachtragen?

Mir ist beim Ausprogieren aufgefallen, dass wenn ich den Hash %seen ausprinte, die Ausgabe schon richtiger ist. Muss da noch ein Hash in ein Array gewandelt werden?
Meo
 2007-04-20 22:17
#76096 #76096
User since
2007-04-20
12 Artikel
BenutzerIn
[default_avatar]
[quote=PerlProfi,20.04.2007, 20:04]Sorry habs grad mal getestet, sind noch ein paar Fehler drin, am Anfang die foreach-Schleife, da hatte ich erst was mit for und hab dann $i drin gelassen, und am Ende das splice, gleich poste ich nochmal den korrekten code, mit Beispiel.[/quote]
Ah okay, ich warte... :-)
PerlProfi
 2007-04-20 22:18
#76097 #76097
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
So, das Beispiel:
Code: (dl )
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
#!/usr/bin/perl
use strict;
use warnings 'all';
use Data::Dumper;

my @found = ("10\tdomain-a", "12\tdomain-b", "5\tdomain-c",
"8\tdomain-a", "14\tdomain-b", "15\tdomain-c",
"11\tdomain-a", "13\tdomain-b", "10\tdomain-c");

# get doubles
my %seen;
foreach my$i (0..$#found) {
my @ele = split("\t", $found[$i]);
$seen{$ele[-1]} = [] unless $seen{$ele[-1]};
push(@{$seen{$ele[-1]}}, [$i, $ele[0]]);
}

# delete doubles
foreach my$key (keys %seen) {
if (@{$seen{$key}} > 1) {
# sort
my $top = $seen{$key}->[0];
foreach my$act (@{$seen{$key}})
{ if ($act->[1] > $top->[1]) { $top = $act } }

# splice
foreach my$act (@{$seen{$key}})
{ if ($act->[0] != $top->[0]) { $found[$act->[0]] = undef } }
}
}
@found = grep { defined($_) } @found;

# output
print "\@FOUND:\n", Dumper(\@found), "\n";

Ich bin mir aber ziemlich sicher, dass das ganze noch viel einfacher zu lösen ist.

Und mal eine Erklärung zum code:
Zuerst werden alle indizes und deren jeweilige Trefferzahl der Haupt-Domain in %seen eingeordnet.
Jeder key von %seen ist dabei eine Haupt-Domain, jeder value ein anon. Array der mit anon. Arrays gefüllt ist, welche jeweils an 0. Position den Index in @found gespeichert haben und an 1. Position die Trefferzahl.

In der 2. foreach-Schleife kann ich jetzt nachsehen, ob die jeweilige Haupt-Domain nu einmal vorkommt, kommt sie öfter vor, suche ich mir den eintrag mit der höchsten Trefferzahl und ersetze alle anderen Einträge aus @found mit undef.

edit: das mit splice() geht wohl doch nicht, aber ohne funktioniert es wenigstens, kann mir vielleicht jemand sagen, wie das mit splice zu lösen wäre ?

MfG\n\n

<!--EDIT|PerlProfi|1177093617-->
Meo
 2007-04-20 22:29
#76098 #76098
User since
2007-04-20
12 Artikel
BenutzerIn
[default_avatar]
PerlProfi... Du bist KLASSE!!!

Klappt jetzt alles sehr gut :-) Die Sortierung stimmt noch nicht ganz, aber das werden wir schon hinbekommen. Ich vermute da muss noch die "Zeichenwandlung" rein wie @found = sort{$a<=>$b}(@ found); oder so ähnlich?

Hab 1000 Dank für die viele Mühe und Arbeit!

Jetzt komme ich erst mal weiter... Wenn sich ein kürzerer Code in meiner weiteren Progger-Phase ergibt, dann lass ich es Dich wissen.
Meo
 2007-04-20 22:31
#76099 #76099
User since
2007-04-20
12 Artikel
BenutzerIn
[default_avatar]
[quote=PerlProfi,20.04.2007, 20:18]edit: das mit splice() geht wohl doch nicht, aber ohne funktioniert es wenigstens, kann mir vielleicht jemand sagen, wie das mit splice zu lösen wäre ?[/quote]
Das mit dem splice() würde mich natürlich auch interessieren.
Meo
 2007-04-20 22:36
#76100 #76100
User since
2007-04-20
12 Artikel
BenutzerIn
[default_avatar]
@PerlProfi...

Das Auszählen der Treffer funktioniert doch einwandfrei. Ich habe jetzt lediglich ein
@found = sort{$a<=>$b}(@found);
@found = reverse (@found);
an Deinen Code angefügt, um die Ausgabe bei mir mit den höchsten Treffern als erstes zu bekommen.

Und auch noch mal Danke für die Erklärungen zu Deienm kompletten Script!
PerlProfi
 2007-04-21 01:17
#76101 #76101
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Hab ich gern gemacht, aber der Weg war wirklich nicht gerade elegent, so gehts nämlich auch:
Code: (dl )
1
2
my %seen;
@found = grep { !$seen{$_->[-1]}++ } sort { $b->[0] <=> $a->[0] } map { [split("\t", $_)] } @found;

Und das ist praktischerweise auch sofort richtig sortiert ;)

Naja, da hätte man auch eher drauf kommen können...
holli
 2007-04-21 15:58
#76102 #76102
User since
2003-10-01
6 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=PerlProfi,20.04.2007, 23:17]Hab ich gern gemacht, aber der Weg war wirklich nicht gerade elegent, so gehts nämlich auch:
Code: (dl )
1
2
my %seen;
@found = grep { !$seen{$_->[-1]}++ } sort { $b->[0] <=> $a->[0] } map { [split("\t", $_)] } @found;

Und das ist praktischerweise auch sofort richtig sortiert ;)

Naja, da hätte man auch eher drauf kommen können...[/quote]
geht noch kürzer :)

Code: (dl )
1
2
my %seen = ();
my @uniq = grep { $seen{(split /\t/)[1]}++ ? undef : $_ } @found;
pq
 2007-04-21 17:12
#76103 #76103
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@Meo: bitte in zukunft code-tags verwenden, so wie es die anderen hier auch machen.
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
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2007-04-20 16:56.