in reply to how to convert two lists into adjacency matrix

As has been suggested before, please read Writeup Formatting Tips. In particular, you should be using <code> tags to preserve whitespace and <p> to break paragraphs.

This is a fairly straightforward task using hashes. First iterate over your first list and increment the value on that key, i.e.

my %hash = (); foreach my $element (@list1) { $hash{$element}++; }

Repeat for the second list, and voila, if a key has a value of 2, it's in both lists. Post some code, and then we can help you debug it.

Update: Or if you don't want to write any code, you could always use List::Compare::Functional.

Replies are listed 'Best First'.
Re^2: how to convert two lists into adjacency matrix
by QM (Parson) on Apr 14, 2009 at 19:38 UTC
    I think you misread the O.P. This isn't about comparing lists, and your code snippet can't get there.

    Maybe this will do:

    use strict; use warnings; my @id1 = (1..5); my @id2 = (11..15); my %hash; my %col_header; my %row_header; my $last = $#id1 > $#id2 ? $#id1 : $#id2; for my $i (0..$last) { if ( defined( $id2[$i] ) ) { $col_header{$id2[$i]} = 1; } if ( defined( $id1[$i] ) ) { $row_header{$id1[$i]} = 1; } if ( defined( $id1[$i] ) and defined( $id2[$i] ) ) { $hash{$id1[$i]}{$id2[$i]} = 1; } } my @col_header = sort numeric keys %col_header; my @row_header = sort numeric keys %row_header; printf "%10s" x (@col_header + 1), "id1\\id2", @col_header; print "\n"; for my $row ( @row_header ) { printf "%10s", "$row"; for my $col ( @col_header ) { printf "%10s", ( exists( $hash{$row}{$col} ) ? "1" : "0"); } print "\n"; } sub numeric { $a <=> $b; }

    with output:

    id1\id2 11 12 13 14 15 1 1 0 0 0 0 2 0 1 0 0 0 3 0 0 1 0 0 4 0 0 0 1 0 5 0 0 0 0 1

    (I'll leave it to OMAR to turn this into a sub.)

    Update: here's the read-from-STDIN version:

    -QM
    --
    Quantum Mechanics: The dreams stuff is made of

      Hi QM, Your code has bee very helpful. Afters days of searching I now finally found this post/site and has given me faith I can do what I need (only a Perl beginner/hacker) Wondering if you could please help me do somthing like this.. which counts and is additive on multiple line items. id1 id2 int 208 10000 1 208 10000 7 207 10000 3 8517 1147 1 3551 1147 2 id1\id2 1147 10000 207 0 3 208 0 8 3551 1 0 8517 1 2 I will be forever in your gratitude!
      Hi QM, Your code has bee very helpful. Afters days of searching I now finally found this post/site and has given me faith I can do what I need (only a Perl beginner/hacker) Wondering if you could please help me do somthing like this.. which counts and is additive on multiple line items.
      id1 id2 int 208 10000 1 208 10000 7 207 10000 3 8517 1147 1 3551 1147 2 id1\id2 1147 10000 207 0 3 208 0 8 3551 1 0 8517 1 2
      I will be forever in your gratitude!