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

时间:2018-07-07 18:15:43

标签: python python-3.x

我正在执教多个田径运动,每次训练大约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]]

4 个答案:

答案 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]]