2012-12-03 37 views
1

我正在尋找在python中複製下面的perl代碼。該對象是獲取由多個散列/字典值排序的散列/字典鍵的數組。例如Perl代碼:python相當於perl按哈希值排序

my $hash = { 
'item1'=> {'id'=>'a', 'pos'=>6}, 
'item2'=> {'id'=>'a', 'pos'=>7}, 
'item3'=> {'id'=>'b', 'pos'=>4}, 
'item4'=> {'id'=>'a', 'pos'=>5}, 
'item5'=> {'id'=>'b', 'pos'=>2}, 
}; 

my @keys = sort { 
    $hash->{$a}->{id} cmp $hash->{$b}->{id} || 
    $hash->{$a}->{pos} <=> $hash->{$b}->{pos} 
} keys %$hash; 

print "@keys\n"; 

這種種由id詞彙,然後通過pos數值,因此,預期的結果是:

item4 item1 item2 item5 item3 
+1

什麼預期產出? – ecatmur

+0

我不是那麼流利的perl ...如果我理解正確,結果應該先按'id'然後按'pos'排序,給項目4,1,2,5,3? – l4mpi

+0

預期結果:item4 item1 item2 item5 item3。所以是的,結果應該按'id'然後按'pos'(數字)排序。 – wannymahoots

回答

1

使用sorted

[k for k, v in sorted(hash.items(), key=lambda item: (item[1].id, item[1].pos))] 
0
from operator import attrgetter 
sorted(hash, key=lambda k:attrgetter('id', 'pos')(hash[k])) 
+0

不應該是'itemgetter'嗎? – stranac

+0

@stranac,attrgetter就像itemgetter,但對於屬性 –

+0

是的,我知道'attrgetter'是什麼,但'id''和''pos''不是字典的屬性,它們是關鍵。 – stranac