2012-10-20 17 views
8

Bir sözlüğe sahip olduğumu ve sonra sözlüğün anahtarlarını içeren bir listenin olduğunu varsayalım. Listeyi sözlük değerlerine göre ayırmanın bir yolu var mı?Python'daki sözlük değerlerine göre bir liste mi sıralama?

Bu çalışıyorlar:

trial_dict = {'*':4, '-':2, '+':3, '/':5} 
trial_list = ['-','-','+','/','+','-','*'] 

kullandığım için gitti:

sorted(trial_list, key=trial_dict.values()) 

Ve var:

TypeError: 'list' object is not callable 

Sonra olabilecek bir işlev oluşturmak gittim trial_dict.get() ile çağrıldı:

def sort_help(x): 
    if isinstance(x, dict): 
     for i in x: 
      return x[i] 

sorted(trial_list, key=trial_dict.get(sort_help(trial_dict))) 

sort_help işlevinin tür üzerinde herhangi bir etkisi olduğunu düşünmüyorum. Bu konuda gitmek için trial_dict.get() kullanmanın doğru yolu olup olmadığından emin değilim.

cevap

8

Evet dict.get doğru (veya en azından, en basit) yoludur:

sorted(trial_list, key=lambda x: trial_dict[x]) 
: Mark Amery, eşdeğer açık lambda yorumladığı gibi

sorted(trial_list, key=trial_dict.get) 

en az iki nedenden dolayı daha iyi olabilir:

  1. sıralama ifadesi görünür ve hemen düzenlenebilir
  2. hataların bastırılmadığını gösterir (liste, dict'ta olmayan bir şey içeriyorsa).
+0

Oi, cevap verdiğim sorulara cevap veriyorum ve akıllı cevaplar veriyorum! :) Daha ciddiyetle: thg'nin cevabı ile benimki arasındaki davranışta bir fark var. Eğer deneme_values, deneme_dict'ın bir anahtarı olmayan bir değer içeriyorsa, bir istisna artacaktır; bu esnada thg'ler bu değeri ön tarafa sessizce sıralayacaktır. Bağlamda bağlı olarak uygun olabilir. –

+0

@ thg435 Dokümanları iki kez kontrol etmeliydim, açıkça yanlış anlamıştım. – tijko

+0

@MarkAmery: [İyiydin, evlat, gerçekten iyi. Ama etrafta olduğum sürece, her zaman en iyisi olacaksın, bakalım?] (Http://www.imdb.com/title/tt0110475/quotes))) – georg

5

sorted yerleşik fonksiyonu (veya listelerin sort yönteminde) anahtar argüman size göre sıralamak istediğiniz değerlerin sıralama ediyoruz listenin üyelerini eşleştiren bir fonksiyon olmak zorundadır. Yani bu istiyorum:

sorted(trial_list, key=lambda x: trial_dict[x]) 
+0

Böyle küçük bir işlev için lambda akılda tutmalıyım. Thg435'i cevaplandı olarak işaretliyorum ama bu gerçekten yararlı oldu, gelecekteki kullanım için lambda kullanmayı düşünmem gerek, teşekkürler! :) – tijko

İlgili konular