我有一个嵌套的元组,我想得到一张有结果的表格,我试图理解这一点,但我没有得到最好的结果。
team = ((35, 'Team1'),(8, 'Team2'),(55, 'Team1'),(65, 'Team2'),(90, 'Team1'))
输出示例:
first second totalgoals
team1 1 2 3
team2 1 1 2
有人可以给我一些帮助吗?
答案 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