2013-04-03 8 views
6

Ben sayılar olarak romen rakamları ile romen rakamları, tamsayı formundaki romen rakamları değerleri olarak kralların bir sözlüğü var. En yaşlı dan genç listeyi sıralamak istiyorumPython: Bir sözlükteki öğeleri bir anahtarın bir parçası ile mi ayırıyorsunuz?

d = {'Zemco III': 3, 'Usamec XL': 40, 'Usamec VII': 7, 'Robert VIII': 8, 'Usamec XLII': 42, 'Mary XXIV': 24, 'Robert III': 3, 'Robert XV': 15, 'Usamec XLIX': 49}

, o Usamec XLII Usamec XLIX önce gelmelidir olduğunu. Listeyi alfabetik olarak sıralamak isterim, bu da Usamec XLII'nin Zemco III'ten önce gelmesidir. Benim yaklaşımım

gibi romen rakamıyla değeriyle sonra, ilk adıyla sıralamak oldu: romen rakamları anahtarın parçası olduğundan amaçlandığı gibi

x = sorted(d.items(),key=operator.itemgetter(0)) 
y = sorted(x,key=operator.itemgetter(1)) 

Ancak, benim alfabetik sıralama çalışmıyor. Sorum şu ki, anahtarın bir kısmı tarafından sözlüğü sıralayabilir miyim, örneğin anahtarım Zemco III ise, tüm anahtarım yerine anahtar kelimelerimi key.split() [0] ile bir şekilde sıralayabilir miyim? Teşekkürler!

cevap

2

key yalnızca bir öğe alan ve sıralamak için gerekenleri döndüren bir işlevdir. Her şey olabilir.

Bu (name_without_rightmost_word, number) anahtar ile öğeleri sıralar:

lambda item: (item[0].rsplit(None, 1)[0], item[1]) 

 

key.rsplit(None, 1)[0] durumunda key.split()[0] daha iyidir:

In [92]: sorted(d.items(), key=lambda (name, num): (name.rsplit(None, 1)[0], num)) 
Out[92]: 
[('Mary XXIV', 24), 
('Robert III', 3), 
('Robert VIII', 8), 
('Robert XV', 15), 
('Usamec VII', 7), 
('Usamec XL', 40), 
('Usamec XLII', 42), 
('Usamec XLIX', 49), 
('Zemco III', 3)] 

kullanırsanız piton 3, bu key kullanmak çok sözcüklü isimler.

+0

Bu çalıştı. Teşekkür ederim Pavel! –

+0

Bir takip sorusu olarak, eğer sözcüğüm sipariş edilseydi, bu yüzden numara ilk önce geldi, sonra isim ve ben yine ismin ilk kısmına göre sıralamak istedim? Aynı formatı takip edersek: 'sort (d.items(), key = lambda (num, name): (num, name.rsplit (Yok, 1) [0])) ama nasıl bir şey eklerim? gibi 'anahtar = operator.itemgetter (1)' gibi? Teşekkürler –

+0

Aynı tuşla sıralama yapıyorsanız, tuple aynı olmalıdır: '(name.rsplit (Yok, 1) [0], num)'. Sadece 'lambda' argümanlarının sırası değişir. Eğer ismi ayırmanız gerekiyorsa, 'itemgetter' size yardımcı olmaz. Tersine çevirilen sözlüğünüz çift sayıları nasıl tutacak? –

0

sadece bunu yapabilirsiniz tür almak için:

sorted_stuff = sorted([(ord(x[0]), x, y) for x, y in d.items()]) 
final_sorted = [(y,z) for x,y,z in sorted_stuff] 

aşağıdaki gibi görünecektir sorted_stuff:

[(77, 'Mary XXIV', 24), (82, 'Robert III', 3)] 

düzgün biçimlendirilmiş edilecektir final_sorted:

[('Mary XXIV', 24), ('Robert III', 3)] 
İlgili konular