Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Array to Hash

by Anonymous Monk
on May 10, 2000 at 20:18 UTC ( #10988=perlquestion: print w/ replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

What's the quickest way to take an array and turn it into a hash with the array values as keys and the hash values as arbitrary true values ie 1?

Comment on Array to Hash
Re: Array to Hash
by btrott (Parson) on May 10, 2000 at 20:29 UTC
    Use a hash slice:
    my @array = qw/foo bar baz quux/; my %hash; @hash{@array} = (1) x @array;
    If you don't care about the keys having values, but just want them to exist, you can just do:
    @hash{@array} = ();
    But now you need to test for existence in the hash by using exists:
    print "foo is there" if exists $hash{foo};
      A hash slice is by far the coolest and most Perlish (and as httptech points out, the fastest) method, but foreach is the most popular. $hash{$_}++ for @array;
      Very cool, btrott. And faster than mine:
      use Benchmark; my @array = qw(a b c d e f g h i j k l m n o p q r s t u v w z y z); my %hash; timethese(500000, { 'btrott' => sub { @hash{@array} = (1) x @array; }, 'httptech' => sub { for (@array) { $hash{$_} = 1 } }, }); Benchmark: timing 500000 iterations of btrott, httptech... btrott: 14 wallclock secs (14.58 usr + 0.00 sys = 14.58 CPU) httptech: 20 wallclock secs (20.68 usr + 0.01 sys = 20.69 CPU)
        While we're on the topic of benchmarking, I'd just like to, for the hell of it, add the worst possible answer to this question:
        map { $code .= "\$hash{$_} = 1;\n" } @array; eval "$code";
        And now for a little program, borrowed from httptech:
        use Benchmark; my @array = qw(a b c d e f g h i j k l m n o p q r s t u v w z y z); my %hash; timethese(10000, { 'btrott' => sub { @hash{@array} = (1) x @array; }, 'plaid' => sub { my $code map { $code .= "\$hash{$_} = 1;\n" } @array; eval "$code"; } });
        Outputs
        Benchmark: timing 10000 iterations of btrott, plaid... btrott: 1 wallclock secs ( 0.56 usr + 0.00 sys = 0.56 CPU) plaid: 23 wallclock secs (22.07 usr + 0.06 sys = 22.13 CPU)
        Don't know why i threw this in. Guess I just didn't want to waste the effort:)
        ...and my old friend 'grep' Not quite as fast as btrott but still a decent contender.
        use Benchmark; my @array = qw(a b c d e f g h i j k l m n o p q r s t u v w z y z); my %hash; timethese( 500000, { 'btrott' => sub { @hash{@array} = (1) x @array; }, 'httptech' => sub { for (@array) { $hash{$_} = 1 } }, 'danimal' => sub { grep { $hash{$_}++ } @array; } }, ); Benchmark: timing 500000 iterations of btrott, danimal, httptech... btrott: 21 wallclock secs (21.38 usr + 0.00 sys = 21.38 CPU) danimal: 22 wallclock secs (22.57 usr + 0.00 sys = 22.57 CPU) httptech: 34 wallclock secs (34.10 usr + 0.00 sys = 34.10 CPU)
Re: Array to Hash
by httptech (Chaplain) on May 10, 2000 at 20:29 UTC
    for (@array) { $hash{$_} = 1 } is how I'd do it.
Re: Array to Hash
by BBQ (Deacon) on May 10, 2000 at 20:33 UTC
    foreach (@ary) {$hash{$_} = 1; }
    Will this do?

    #!/home/bbq/bin/perl
    # Trust no1!
Re: Array to Hash
by plaid (Chaplain) on May 10, 2000 at 20:38 UTC
    Yet another way
    map { $hash{$_} = 1 } @array;
      no. no map in void context please. That's what you have the backwards foreach for.
      $item{$_} = 1 for @list;
        What is so bad about map in map in void context ? I mean no harm can be done, can it ?
Re: Array to Hash
by zodiac (Beadle) on May 10, 2000 at 20:54 UTC
Re: Array to Hash
by Jonathan (Curate) on May 11, 2000 at 13:42 UTC
    Well, well, well. There's more than one way to do it what a surprise :-)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://10988]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (11)
As of 2014-07-30 20:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (240 votes), past polls