2011-02-03 5 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 세의 사람들의 이름을 반환하려고합니다. 값으로 사전을 검색하고 키를 반환하려면 어떻게해야합니까?파이썬에 대한 dict 값을 통해 키 찾기

+0

귀하의 예를 들어, 데이터는 질문을 일치하지 않습니다. 사전이 아닌 두 개의 목록으로 시작합니다. 데이터가 key = name 및 value = age 인 dict 유형으로 시작하는 경우 역 사전 검색을 수행합니다. 여기에서 일부 토론 http://stackoverflow.com/questions/2568673/inverse-dictionary-lookup-python#2568673 – DevPlayer

+0

또한 "name"이라는 함수가 잘못되었습니다. 대부분의 연령대에 여러 이름이 있으므로 아마도 "이름"이라고해야합니다. 또한 귀하의 데이터는 잠재적 인 문제를 암시합니다. 실제 데이터가 사람들의 이름이나 사람의 나이가 아닐지라도, 어떤 크기의 데이터에서도 두 가지 객체 모두 고유하지 않을 가능성이 높습니다. 예를 들어, 존 스미스가 특정 날에 태어난 사람이 한 명 이상일 수 있습니다. – DevPlayer

답변

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

nameagedict.items()은 (키, 값) 튜플로 사전의 모든 항목 목록을 제공합니다.

+1

파이썬 2에서는 종종'items'보다는'iteritems'을 원합니다. –

0

비슷한 문제가있었습니다. 다음은 키와 값을 튜플 배열로 반환하는 솔루션입니다.

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

실제로 필요한 것은 역방향 조회 사전입니다. 물론 이것은 Key : value가 1 대 1의 관계 일 때만 작동합니다 (1 대 다수). (map) (람다 (k, v) : (v, k), {1 : 2, 3 : 4, 5 : 6} .items())) – 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']} 

가 원하는 경우() 정렬 알아 둡니다. 또한 계수()를 추가 할 수 있도록 3 Cathys 7 하건데이 있다면 데이터가

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

같은 것을 돌려 보냈다.

위의 내용은 짧아 보이지만 실제 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) 
관련 문제