2011-02-03 13 views
2
NAMES = ['Alice', 'Bob','Cathy','Dan','Ed','Frank', 
      'Gary','Helen','Irene','Jack', 'Kelly','Larry'] 
AGES = [20,21,18,18,19,20,20,19,19,19,22,19] 

def nameage(a,b): 
    nameagelist = [x for x in zip(a,b)] 
    nameagedict = dict(nameagelist) 

    return nameagedict 

def name(a): 
    for x in nameage(NAMES,AGES): 
     if a in nameage(NAMES,AGES).values(): 
      print nameage(NAMES,AGES).keys() 

print name(19) 

私は19歳の人の名前を返そうとしています。値で辞書を検索してキーを返すにはどうすればよいですか?Pythonの辞書で値をキーで検索

+0

あなたの例のデータは、あなたの質問に一致していません。あなたは辞書ではなく2つのリストから始めます。あなたのデータがkey = nameとvalue = ageのdictの型で始まっている場合、逆辞書検索を行います:ここでの議論http://stackoverflow.com/questions/2568673/inverse-dictionary-lookup-python#2568673 – DevPlayer

+0

また、 "名前"という名前の関数は誤解を招きます。ほとんどの年代には複数の名前があるので、おそらく名前に「名前」を付けるべきです。また、あなたのデータは潜在的な問題を暗示しています。実際のデータは人の名前でも人の年齢でもないかもしれませんが、どんなサイズのデータ​​でも、両方のオブジェクトはユニークではない可能性が非常に高いです。あなたの例では、特定の日に生まれたジョン・スミスがもっと多いことがあります。 – DevPlayer

答えて

9
print [key for (key,value) in nameagedict.items() if value == 19] 

nameagedict.items()は、(キー、値)タプルとして辞書内のすべての項目のリストを提供します。

+1

Python 2では、 'items'ではなく' iteritems'が必要なことがよくあります。 –

0

私も同様の問題がありました。ここでは、タプルの配列としてキーと値を返す私のソリューションです。

filter(lambda (k,v): v==19, nameagedict.items()) 
+0

私が実際に必要とするのは逆引き参照辞書です。もちろん、これはKey:valueが1対1の関係(1対多ではない)の場合にのみ機能します。 (v、k)、{1:2、3:4、5:6} .items())) 'dict(map(lambda(k、v) – UltramaticOrange

0

部分的な解決策

names = {age:sorted([name for index,name in enumerate(NAMES) if age == AGES[index]]) for age in sorted(set(AGES))} 
print(names) 

戻り値:

{18: ['Cathy', 'Dan'], 19: ['Ed', 'Helen', 'Irene', 'Jack', 'Larry'], 20: ['Alice', 'Frank', 'Gary'], 21: ['Bob'], 22: ['Kelly']} 

ご希望の場合)(ソートアウトしておきます。また、count()を追加して、データが返されるように、

{18: [('Cathy',3), ('Dan',7), ...} 

3つのCathysと7つのDansがある場合は、

私は実際のforループが元のリストよりも反復回数が少なくなると思っています。

あるいはさらに良い:

def names(age): 
    index = 0 
    while index < len(AGES): 
     if AGES[index] == age: 
      yield NAMES[index] 
     index += 1 

print('19 year olds') 
for name in names(19): 
    print(name) 
関連する問題