2016-04-12 31 views
0

Sözlüğümün anahtarı olarak, başkanın isimleriyle bir sözlükte, açılış yılı, hizmet verilen yıl, dönemin başlangıcındaki yaşı ve hangi eyaletten olduklarını içeren bir sözlükten geçiyorum. Bu örnekte sadece yaşıma baktığımda onların bu döneme başladıklarını düşünüyorum. dictonary örnek:Sözlükten sadece minimum değer elde etmek

pres_data={"Reagan": (1981, 8, 69,"California"), "Bush":(1989, 4,64,"Texas")} 

Sözlük yukarıdaki gibi Cumhurbaşkanı ve verilerin daha geçer, ancak burada koymak çok fazla olurdu çünkü ben dahil değilim.

(64,["George Bush"]) 

Yani (Ben almak için bir dakika() işlevini kullanın sanıyorum ki ilk minimum yaş gösteririz, ama çok azının:

aradığım çıkışı Sadece benim kurulumumda çalıştı ve daha sonra bu sözlüğün en genç yaşını paylaşan Başkan isimlerinin bir listesi vardı. Bugüne kadar

Kodum:

pres_data={"Reagan": (1981, 8, 69,"California"), "Bush":(1989,4,64,"Texas")} 
for key, value in pres_data.items(): 
    age_start_term=value[2] 
    print(age_start_term,key) 

benim age_start_term değişkenden sonra genç = min (age_start_term) gibi bir şey yerleştirerek düşünüyordum, ama bu sadece bu bir yineleme kontrol ederim. Yani sanırım hem yapılacak minimum karşılaştırmayı hem de sözlükte temsil edilen en küçük yaştaki tuşları içeren bir listenin yanına yazdım. Yinelemeye başladığımda tüm yaşları karşılaştırmak için elime ne ekleyebilirim? Ve sözlükteki en küçük yaşlara karşılık gelen anahtarları almak için, bu satırlarda bir şey yapabilir miyim?

allyoungest= [k for k in pres_data if pres_data[k] == #variable representing youngest] 

cevap

6

min fonksiyonu karşılaştırmak için çalışıyoruz öğelerden bir karşılaştırma anahtarı ayıklamak için kullanabilirsiniz key adlı bir argüman alır. Senin durumunda, gibi bir şey:

youngest = min(pres_data.items(), key=lambda item: item[1][2]) 

Bu size verecektir: Eğer istersen çıkış biçimi haline çevirmek mümkün olmalıdır

('Bush', (1989, 4, 64, 'Texas')) 

.

min_age = youngest[1][2] 
all_youngest = [name for name in pres_data if pres_data[name][2] == min_age] 
0

Temptation min kullanmaktır, ancak bu listeye aracılığıyla iterating gerektirir: Aynı asgari yaş ile tüm cumhurbaşkanları listesi istiyorsanız

, Tahmin ettiğin gibi sadece başka bir geçiş yapabilir En az bir kez, ve aynı zamanda, dönemin başlangıcında bazı endeksi de oluşturmalısınız. Daha iyi bir seçenek, başlangıç ​​dönemindeki bir cumhurbaşkanına yaşın bir sözlüğü oluşturmak ve min çağın izini sürdürebilmenizdir. Öyleyse, o endeksle eşleşen girişlere başvurmanız yeterlidir.

import collections 

pres_data = { 
    "Reagan": (1981, 8, 69,"California"), 
    "Bush": (1989,4,64,"Texas"), 
    "LizardKing": (2569,4,64,"Nrzilplack") 
} 

bday_dict = collections.defaultdict(list) 

min_age = 1000 
for key, value in pres_data.items(): 
    age_start_term = value[2] 
    if age_start_term < min_age: 
     min_age = age_start_term 

    bday_dict[age_start_term].append(key) 

print(min_age, bday_dict[min_age]) 
# 64 ['LizardKing', 'Bush'] 
0

Buna ne dersiniz?

sorted(pres_data.items(), key= lambda x: x[1][2])[0] 
+1

Bu O (n log n)' olacaktır 'dk kullanılarak ve hala bir lambda kullanımı bu yüzden sıralı kullanarak mantığı göremiyorum. –

+0

Haklısınız. Bir bütün olarak soru okumamak benim suçumdu :) –

2

bu konuda gitmek için işlevsel bir şekilde: Bir 'O (n) karşı

from functools import reduce 

pres_data = {"Reagan": (1981, 8, 69,"California"), "Bush":(1989,4,64,"Texas")} 

def min_pres(acc, it): 
    min_age, presidents = acc 
    name, (year, served, age, state) = it 

    if min_age is None or age < min_age: 
     return (age, [name]) 

    elif age == min_age: 
     presidents.append(name) 

    return acc 

reduce(min_pres, pres_data.items(), (None, None))