2012-09-26 2 views
-3

я следующие данныекак написать карту уменьшить для следующего

Name Year score 
A 1996 84 
A 1997 65 
A 1996 76 
A 1998 78 
A 1998 65 
B 1998 53 
B 1996 98 
B 1996 83 
B 1996 54 

Я хочу, чтобы результат следующим образом

Name Year max_score 
A 1996 84 
B 1996 98 

Как я могу написать питон карту уменьшить код для этой работы?

Я могу создать NAME и YEAR как единый ключ и получить оценку по мере того, как значение будет работать.

Но есть ли другой способ справиться с этим.

+0

Вы хотите, чтобы только эти две строки были выходными? – faizan

+0

Я не понимаю вопроса. У вас, видимо, есть подход, который работает, но вы ищете лучший способ? Можете ли вы показать нам какой-то код? –

+0

Можете ли вы прояснить вопрос. Мое понимание состоит в том, что вы хотите, чтобы строка для каждого имени соответствовала строке, в которой они имеют самый высокий балл. Это верно? –

ответ

2

Если предположить, что все ваши годы и оценки положительны:

from collections import defaultdict 

mapping = defaultdict(lambda: (0,0)) 
with open(datafile) as f: 
    for line in f: 
     name,year,score = line.split() 
     try: 
      year = int(year) 
      score = int(score) 
     except ValueError: 
      continue 

     if score > mapping[name][1]: 
      mapping[name] = year,score 

Или чуть более лаконична, но менее устойчив к ошибкам:

from collections import defaultdict 

mapping = defaultdict(lambda: (0,0)) 
with open(datafile) as f: 
    f.readline() #header. Don't need it. 
    for line in f: 
     name,year,score = line.split() 
     if int(score) > mapping[name][1]: 
      mapping[name] = int(year),int(score) 
0

Это то, что вы после этого?

def mapper(key, value): 
    name, year, score = value.split() 
    yield name, (year, score) 

def reducer(name, values): 
    yield name, max(values, key=operator.itemgetter(1)) 
Смежные вопросы