从字典中创建具有特定值的列表

问题描述 投票:0回答:4

我正在执行多项运动,这项运动正在进行约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]]

python python-3.x
4个回答
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
投票

您将附加到外部列表,而不是内部列表。将内部列表设置为如下变量:

inner_list = []

然后将v附加到inner_list,如下所示:

inner_list.append(v)

在for循环结束时,将内部列表追加到new_list。

new_list.append(inner_list)

如果有效,请告诉我!


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()]

-1
投票

对于第一个问题,请使用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]]
© www.soinside.com 2019 - 2024. All rights reserved.