Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
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 taking refuge in the Monastery: (12)
As of 2014-09-17 09:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (71 votes), past polls