2016-04-12 6 views
0

私は、辞書のキーとして大統領の名前と、年が入ったタプル、就役年、就任年齢、出身国の順番で辞書を繰り返しています。この例では、私は彼らの言葉を始める時代を見ているだけです。 dictonaryのサンプル:辞書の最小値のみを取得する

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

辞書は社長と上記のようなデータのよりを通過するが、それはここに置くことが多すぎるだろうので、私はそれを含めていませんよ。

私が探している出力は次のとおりです。

(64,["George Bush"]) 

だから、私はそれを得るために分()関数を使用すると仮定していた(最初の最低年齢を表示しますが、それはhasn私のセットアップではまだ働いていませんでした)、その後、その辞書から一番若い年齢を共有する大統領の名前のリストが続きます。これまで

マイコード:

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) 

私はage_start_term変数の後に最年少=分(age_start_term)のようなものを置くことを考えていたが、それはそれだけで一回の反復をチェックします。だから、私は、最小の比較をして、辞書に表示された若い年齢に沿ったキーを含むリストの横に印刷することを探していると思います。 一度繰り返すと、すべての年齢を比較できるようにするために、自分が持っているものに何を追加できますか?そして辞書の中で最も若い年齢に対応するキーを得るために、私はこれらの行に沿って何かをすることができますか?

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

答えて

6

min機能を使用すると、比較しようとしている項目から比較のキーを取り出すのに使用することができますkeyと呼ばれる引数を取ります。あなたのケースでは、何かのように:

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

これはあなたを与える:あなたが好きな出力フォーマットに変身することができるはずです

('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

誘惑は分を使用することですが、それはでリストを反復処理が必要です少なくとも1回は、また、期間の開始時に年齢に関するいくつかの指標を構築する必要があります。より良い選択肢は、開始時の年齢の辞書を大統領に作成し、あなたが最小年齢を把握するように構築することです。次に、そのインデックスに一致するエントリを参照するだけです。

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

この場合はどうなりますか?

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

これはO(n個のnを記録)'だろう ''分を使用して、あなたはまだラムダを使用だから私はソートを使用してロジックを参照することはできません。 –

+0

あなたは正しいです。それは全体として質問を読んでいない私のせいでした:) –

2

それについて移動する機能的な方法: `O(N)とは対照的に、

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)) 
関連する問題