2017-12-21 27 views
-2

를 사용하여 딕셔너리의 배열에서 최대 키 값 쌍 찾기 :내가 좋아하는 목록이 파이썬

[{"name":"john","age":40,"class":10}, 
{"name":"john","age":45,"class":12}, 
{"name":"sam","age":10,"class":5}, 
{"name":"sam","age":11,"class":9}, 
{"name":"mark","age":50,"class: 8"}] 

내가 고유 한 이름의 최대 나이 싶어합니다. 파이썬을 사용하여 어떻게 할 수 있습니까?

내 예상 답 :

루프 솔루션에 대한 간단한
[{"name":"john","age":45,"class":12}, 
{"name":"sam","age":11,"class":9}, 
{"name":"mark","age":50,"class: 8"}] 
+0

힌트 :'itertools.groupby'은. 지금까지 뭐 해봤 니? –

+0

사전과'for' 루프를 사용하여 직접적인 해결책을 구현할 수 있어야합니다. – timgeb

+0

좋습니다. 질문을 업데이트했습니다. 그러나 무엇을 시도 했습니까? –

답변

4

이 작업을 수행 할 itertools.groupby를 사용할 수 있습니다

from itertools import groupby 

data = [{"name":"john","age":40,"class":10}, 
     {"name":"john","age":45,"class":12}, 
     {"name":"sam","age":10,"class":5}, 
     {"name":"sam","age":11,"class":9}, 
     {"name":"mark","age":50,"class": 8}] 

# groups dictionary by "name" 
# takes max dictionary of each group by "age" 
result = [max(list(g), key=lambda x: x['age']) for _, g in groupby(sorted(data, key=lambda x: x['name']), key=lambda x: x['name'])] 

print(result) 

출력한다 :

[{'name': 'john', 'age': 45, 'class': 12}, 
{'name': 'sam', 'age': 11, 'class': 9}, 
{'name': 'mark', 'age': 50, 'class': 8}] 
+1

itertools.groupby (l, key = lambda x : x [ 'name'])]]에서 _, g에 대한 한 줄의''max (list (g), key = lambda x : x [ 'age']) –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ 나는 환호를 더하기 :-) – RoadRunner

+0

이 오류를 얻는 중 TypeError : 'list'객체를 호출 할 수 없습니다. – RosAng

2

A = [{"name":"john","age":40}, 
{"name":"john","age":45}, 
{"name":"sam","age":10}, 
{"name":"sam","age":11}, 
{"name":"mark","age":50}] 


res = {} 
for i in A: 
    if i['name'] not in res: 
     res[i['name']] = i['age'] 
    else: 
     if res[i['name']] < i['age']: 
      res[i['name']] = i['age'] 

print res 

결과 다음과 같습니다

{'john': 45, 'sam': 11, 'mark': 50} 
+0

불행히도, 이것은 데이터의 원래 구조를 보존하지 않습니다 (대부분의 실제 사례에서 중요 할 수 있음). –

+0

아주 가깝습니다. 결과 = { '존': 45, '샘': 11, '마크': 50}; newresult = [{ "name": name, "age": result [name]} 이름에서 결과로] – ShpielMeister

+0

나는 탐구를 약간 변경하고 새로운 필드와 excted 응답 형식을 추가했습니다. – RosAng

1

당신이 조금 더 구체적인 목표를 지정할 수 있습니까? 구조를 보존하고 싶습니까? 사전에있는 모든 이름의 목록을 원하십니까? 당신은이 같은 기능을 쓸 수있다 : 주어진 이름에 대한 최대 값을 반환

def maxdictlist(name,dictlist): 
    maxlst = [] 
    for x in dictlist: 
     if x["name"] == name: 
      maxlst.append(x["age"]) 
    return max(maxlst) 

print(maxdictlist("john",A)) 

합니다. 당신이 관심과 구조를 유지하려는 이름의 목록을 저장 괜찮 있다면, 당신은 또한 최대 기능에 대한 키를 사용하여, 같은 것을 할 수 있습니다 :

def ke(v,name): 
    if v["name"] == name: return v["age"] 
    else: return 0 #0 as default value 

lst = [] 
names = ["john","sam"] 
res = [max(A,key= lambda v:ke(v,name))) for name in names] 

print(lst) 

을 나는 것 이 두 번째 방법에 대한 조언.