2012-02-13 15 views
7

ハッシュを裏返す最もエレガントな方法は何ですか?Whayは、ハッシュを裏返す最もエレガントな方法ですか?

これは、キーを値で置き換えることを意味し、その逆もあります(すべての値が100%ユニークであると仮定して)。

など。

foreach my $key (keys %start) { 
    my $value = $start{$key}; 
    $finish{ $value } = $key; 
} 

しかし、これはそうすることの最もPerly、エレガントな方法にすることはできません。

my %start = (1=>"a", 2=>"b", 3=>"c"); 

# ... 

# PROFIT: 
my %finish = ("c" => 3, "b" => 2, "a" => 1); 

スタートは、私はそれを強引なやり方を行うことができます知っています!

+0

あなた:そして、ハッシュ変数にそのリストを割り当てると、キーと値

それとも、map(あまりエレガントそれでも慣用)を使用することができますになっても、要素になってきて奇数の要素を持つハッシュに変換しますbrute forceメソッドが正しく動作しません。 'keys%start'をループする必要があります。 – cjm

+2

「100%ユニーク」とはどういう意味ですか?あなたは広告で働いていますか?何か「ユニークな95%」がありますか?あなたはあなたの妻にあなたの「95%のユニークな愛」を伝えていますか? –

+0

@cjm - そうです。私はコードを修正するために編集し、最小限の範囲でレキシカル変数を宣言するようにクリーンナップを追加しました(言い換えれば、どこにでもmyを追加しました)。 Ike - あなたが同意しない場合は、編集内容を元に戻してください。 – DVK

答えて

15

reverseは、最も慣用的な方法の中で、おそらくです:

my %finish = reverse %start; 

逆フォーム(KEY1値1のKEY2の値2 ... keyN値N)のリストとして%startハッシュを取るので、これは、動作します。リストを逆順に反転します(valueN keyN ... value1 key1)。

my %finish = map { ($start{$_} => $_) } keys %start; 
+3

'@finish {value%start} = keys%start'は既存のペアを保存します。 – tchrist

+1

'reverse%start'は賢いですが、ちょっと賢すぎるかもしれません。 – cjm

+0

@ tchrist - あなたは明確にしていただけますか? 「既存のペアを維持する」とはどういう意味ですか? – Ike

10
my %start = (1=>"a", 2=>"b", 3=>"c"); 

my %finish; 
@finish{values %start} = keys %start; 
+0

先週、その解決策を初めのPerlクラスに説明するために半分の[CENSORED]時間がかかりました。私は材料からそれを取り除くことに決めました。それらは単にハッシュスライスを理解できません。彼らは頭の中で立ち往生し、 '@ 'は配列を意味します。彼らは '{'がハッシュを意味し、 '@ 'は重要でないことを理解していません。 – tchrist

+1

バーチャル+1(まだアップアップできません)。私はかなり完全な初心者ではないので、上記のコメントで学生と同じ問題がなかった:) – Ike

+0

@ike - あなたは今すぐ非決定に投票するのに十分な担当者を持っているはずです。そして、大きな慣用表現のために私の+1 – DVK

関連する問題