2012-12-03 3 views
1

파이썬에서 다음 perl 코드를 복제하려고합니다. 객체는 여러 해시/사전 값별로 정렬 된 해시/사전 키 배열을 얻는 것입니다. 예 펄 코드 : 예상 결과가 그래서 다음 수치 pos에 의해 전적으로 id에 의해perl과 동등한 파이썬 hash 값으로 정렬

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"; 

이 종류, :

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와 dont는 dict의 속성이 아니라 키입니다. – stranac