我正在执行多项运动,这项运动正在进行约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,7.17,[],164,1.127,12.17,[],152,0.165,9.234]
但应该是:[[152,0.17,10.17],[164,1.127,12.17],[152,0.165,9.234]]
问题2:在一天结束时,我需要每位运动员获得当天的平均分数。如何将所有运动员的短跑合并到一个平均值的列表中?
例如:
当天结束时的输出应为:[[152,0.168,9.202],[164,1.127,12.17]]
您的代码存在问题
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
将其转换为您想要的形式应该很容易
您将附加到外部列表,而不是内部列表。将内部列表设置为如下变量:
inner_list = []
然后将v
附加到inner_list,如下所示:
inner_list.append(v)
在for循环结束时,将内部列表追加到new_list。
new_list.append(inner_list)
如果有效,请告诉我!
您可以使用列表推导更轻松地完成此类操作。这是你想要做的事情的列表理解等价物。
[[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()]
对于第一个问题,请使用list comprehension:
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]]