根据条件聚合嵌套元组的结果

时间:2018-05-14 13:28:28

标签: python tuples

我有一个嵌套的元组,我想得到一张有结果的表格,我试图理解这一点,但我没有得到最好的结果。

team = ((35, 'Team1'),(8, 'Team2'),(55, 'Team1'),(65, 'Team2'),(90, 'Team1'))

输出示例:

       first  second totalgoals
team1    1      2        3
team2    1      1        2

有人可以给我一些帮助吗?

4 个答案:

答案 0 :(得分:3)

您可以使用词典理解:

team = ((35, 'Team1'),(8, 'Team2'),(55, 'Team1'),(65, 'Team2'),(90, 'Team1'))
results = {a:[sum(c < 45 and d == a for c, d in team), sum(c >= 45 and d == a for c, d in team)] for a in set(d for _, d in team)} 
print('\tfirst  second totalgoals')
for a, [first, second] in results.items():
  print(f'{a}\t{first}\t{second}\t{first+second}')

输出:

    first  second totalgoals
Team1   1   2   3
Team2   1   1   2

答案 1 :(得分:2)

这是一个纯Python基于字典的解决方案:

from operator import itemgetter

lst = ((35, 'Team1'),(8, 'Team2'),(55, 'Team1'),(65, 'Team2'),(90, 'Team1'))

teams = map(itemgetter(1), lst)
d = {team: dict.fromkeys(('first', 'second', 'total'), 0) for team in teams}

for minutes, team in lst:
    if minutes <= 45:
        d[team]['first'] += 1
    else:
        d[team]['second'] += 1
    d[team]['total'] += 1

结果:

print(d)  

{'Team1': {'first': 1, 'second': 2, 'total': 3},
 'Team2': {'first': 1, 'second': 1, 'total': 2}}

答案 2 :(得分:1)

您可以轻松地将平面目标列表转换为由团队名称索引的字典,并立即对第一个和第二个半部分进行括号,这样您就不必对数据进行多次迭代,例如:

import collections

team = ((35, 'Team1'), (8, 'Team2'), (55, 'Team1'), (65, 'Team2'), (90, 'Team1'))

team_goals = collections.defaultdict(lambda: [0, 0])  # save some time with a dict factory
for entry in team:
    team_goals[entry[1]][entry[0] > 45] += 1

至于如何工作 - 只要遇到不存在的密钥,collections.defaultdict()就会调用传递的工厂(lambda: [0, 0])创建一个新密钥,这样每个团队都会以{{1}开头列出其值。然后,当我们迭代数据时,我们所需要的只是一个简单的[0, 0]检查作为索引选择器 - in this context,它将被视为生成entry[0] > 45的{​​{1}} int(因此上半部分)和0 False(因此下半部分)因此使我们能够选择适当的增量索引。

这会导致一个很好的字典,其键保存团队名称,而其值基本上只是一个两元素列表,计算第一个和第二个半月的目标。

如果您想打印数据,只需使用str.format()即可获得所需的表格,例如:

1

哪个会给你:

         first second totalgoals
Team1      1     2        3     
Team2      1     1        2   

作为额外的整洁,您可以获得True键的最大字符串长度,并根据您的团队数据动态填充左侧。

答案 3 :(得分:0)

如果您可以使用第三方库(pandas),它具有实际显示表格的明显优势(您可以将其导出为各种格式,如CSV,HTML等):

In [1]:
df =  pd.DataFrame(list(team), columns=['Value', 'Team'])
df['Goal'] = np.where(df['Value'] <= 45, 'first', 'second')
df = df.groupby('Goal')['Team'].value_counts().unstack(0)
df['totalgoals'] = df.sum(axis=1)
df

Out[1]:
Goal   first  second  totalgoals
Team                            
Team1      1       2           3
Team2      1       1           2