我正在执教多个田径运动,每次训练大约20冲刺。尽管我不需要系统中的所有值,但每次培训都记录在无法更改的系统中。
假设我有以下数据,那么到目前为止:
data = {
1200: {'id': 152, 'start': 0.170, 'middle': 4.234, 'end': 9.170, 'painscore': 68,},
1205: {'id': 164, 'start': 1.127, 'middle': 7.354, 'end': 12.170, 'painscore': 49,},
1210: {'id': 152, 'start': 0.165, 'middle': 4.031, 'end': 9.234, 'painscore': 75, }
}
new_list = []
for x in data:
new_list.append([])
for k,v in data[x].items():
if k == 'id' or k == 'start' or k== 'end':
new_list.append(v)
print(new_list)
问题1:如何将输出更改为可以使用的正确格式?
输出如下:[[],152,0.17,9.17,[],164,1.127,12.17,[],152,0.165,9.234]
但是,应为:[[152,0.17,9.17],[164,1.127,12.17],[152,0.165,9.234]]
问题2:在一天结束时,我需要为每个运动员提供当天的平均得分。如何将所有运动员的冲刺合并到具有平均值的列表中?
例如:
一天结束时的输出应为:[[152,0.168,9.202],[164,1.127,12.17]]
答案 0 :(得分:2)
您的代码存在问题
new_list.append(v)
这不会将值附加到您已经在new_list中插入的列表中。您需要将元素追加到new_list的最后一个元素上,即
new_list[-1].append(v)
另一种解决方案是:
data = {
1200: {'id': 152, 'start': 0.170, 'middle': 4.234, 'end': 9.170, 'painscore': 68,},
1205: {'id': 164, 'start': 1.127, 'middle': 7.354, 'end': 12.170, 'painscore': 49,},
1210: {'id': 152, 'start': 0.165, 'middle': 4.031, 'end': 9.234, 'painscore': 75, }
}
new_list = [
[v['id'], v['start'], v['end']] for (k, v) in data.items()]
print(new_list)
对于第二部分,如果您愿意使用外部库,则这里有个提示:
import pandas as pd # version must be ≥ 0.23.0
data = {
1200: {'id': 152, 'start': 0.170, 'middle': 4.234, 'end': 9.170, 'painscore': 68,},
1205: {'id': 164, 'start': 1.127, 'middle': 7.354, 'end': 12.170, 'painscore': 49,},
1210: {'id': 152, 'start': 0.165, 'middle': 4.031, 'end': 9.234, 'painscore': 75, }
}
df = pd.DataFrame.from_dict(data, orient='index', columns=['id', 'start', 'end'])
means = df.groupby('id').mean()
print(means)
这会给你
start end
id
152 0.1675 9.202
164 1.1270 12.170
将其轻松转换为所需的形式
答案 1 :(得分:1)
您要附加到外部列表,而不是内部列表。将您的内部列表设置为这样的变量:
inner_list = []
然后将v
附加到inner_list中,如下所示:
inner_list.append(v)
在for循环的末尾,将内部列表追加到new_list。
new_list.append(inner_list)
让我知道它是否有效!
答案 2 :(得分:1)
使用列表推导,您可以更轻松地执行此类操作。这就是您要尝试执行的列表理解。
[[v for k, v in data[x].items()
if k == 'id' or k == 'start' or k == 'end']
for x in data]
这样的嵌套列表理解会产生嵌套列表。
但是它可以进一步简化为:
[[x[k] for k in ['id', 'start', 'end']] for x in data.values()]
答案 3 :(得分:-1)
对于第一个问题,请使用列表理解:
new_list = [list(v.values()) for v in data.values()]
print(new_list)
这将输出:
[[152, 0.17, 4.234, 9.17, 68], [164, 1.127, 7.354, 12.17, 49], [152, 0.165, 4.031, 9.234, 75]]
对于第二个问题,创建一个由id
索引的期望字段值的记录的字典,然后对该字典中每个项目的记录长度执行求和和除法,以获取每个id
的平均值。
from collections import defaultdict
records = defaultdict(list)
for record in data.values():
records[record['id']].append([record['start'], record['end']])
print([[id] + list(map(lambda s: s / len(record), map(sum, zip(*record)))) for id, record in records.items()])
这将输出:
[[152, 0.1675, 9.202], [164, 1.127, 12.17]]