2015-02-22 4 views
-1

У меня есть список с кортежами, который выглядит так. Каждый кортеж - игрок в бейсбол, а затем статистика для этого игрока. ** Обратите внимание, что несколько кортежей в списке (фактический список намного больше этого) могут содержать одного и того же игрока, но со статистикой из другой бейсбольной игры.Python List Сопоставление агрегирующих данных кортежа

[('Jimmy Brown', '4', '0', '0'), ('Jimmy Brown', '4', '1', '1'), ('Stu Martin', '5', '0', '0'), ('Enos Slaughter', '3', '2', '1'), ('Stu Martin', '3', '1', '1')] 

Я хочу сделать расчеты для каждого игрока. В приведенном выше списке примеров мне может понадобиться рассчитать среднее значение третьего индекса для Джимми Брауна. Поэтому я бы хотел (0 + 1)/2. Как я могу это сделать?

+3

кортежи, а не truples. – Newb

+0

https://docs.python.org/2/tutorial/introduction.html – user3467349

+0

Не знаю, почему, но я как бы обнаружил назначение перед завтра ... –

ответ

-1
l = [('Jimmy Brown', '4', '0', '0'), ('Jimmy Brown', '4', '1', '1'), ('Stu Martin', '5', '0', '0'), ('Enos Slaughter', '3', '2', '1'), ('Stu Martin', '3', '1', '1')] 

l_jimmy = [ float(item[ 2 ]) for item in l if item[ 0 ] == 'Jimmy Brown' ] 

# or via map/filter: 
l_jimmy = map(lambda x: float(x[ 2 ]), filter(lambda x: x[ 0 ] == 'Jimmy Brown', l)) 

# final calculation 
avg = sum(l_jimmy)/len(l_jimmy) 
+0

@MartijnPieters Да, оно исправлено. – sergzach

+0

Caveat: Я не голосовал на вашем посту. –

0

В примерном списке выше, я мог бы вычислить среднее значение 3-го индекса Джимми Брауна.

Обратите внимание, что вам придется отфильтровать список только для кортежей, содержащих Джимми Брауна.

l = [('Jimmy Brown', '4', '0', '0'), ('Jimmy Brown', '4', '1', '1'), ('Stu Martin', '5', '0', '0'), ('Enos Slaughter', '3', '2', '1'), ('Stu Martin', '3', '1', '1')] 
cumulative = 0 
num =0 
for t in l: 
    if t[0]=='Jimmy Brown': 
     cumulative += t[3] 
     num +=1 
return cumulative/float(num) 
0

Вы можете использовать itertools.groupby сгруппировать внутренние кортежи на основе первого элемента на кортеж, а затем для каждой внутренней группы принять требуемое среднее значение. Пример -

from itertools import groupby 
from operator import itemgetter 
for i,grp in groupby(sorted(lst),key=itemgetter(0)): 
    grplst = list(grp) 
    print(i," - ", sum(float(x) for _,_,x,_ in grplst)/len(grplst)) 

Демо -

>>> lst = [('Jimmy Brown', '4', '0', '0'), ('Jimmy Brown', '4', '1', '1'), ('Stu Martin', '5', '0', '0'), ('Enos Slaughter', '3', '2', '1'), ('Stu Martin', '3', '1', '1')] 
>>> from itertools import groupby 
>>> from operator import itemgetter 
>>> for i,grp in groupby(sorted(lst),key=itemgetter(0)): 
...  grplst = list(grp) 
...  print(i," - ", sum(float(x) for _,_,x,_ in grplst)/len(grplst)) 
... 
Enos Slaughter - 2.0 
Jimmy Brown - 0.5 
Stu Martin - 0.5 
Смежные вопросы