复杂的字典迭代

时间:2013-12-24 11:42:09

标签: python list dictionary iteration

我是Python和编程的新手。试图寻找答案,但我真的在努力解决这个问题。真的很感激任何帮助。

我的数据在字典中如下:

averages_dict = {'probe1': [8.1, 7.9, 8.2], 'probe2': [7.8, 7.5, 7.7], 'probe3': [7.1, 6.6, 6.8], 'probe4': [6.7, 6.3, 6.5]}

其中列表中的项目(值)对应于不同的个人[A,B,C]。

我正在尝试编写一个脚本来获取每个人(值列表[A,B,C]中的项目)的probe1,probe2和probe3(averages_dict中的键)的平均值。最后,我想要一个探针平均值列表,每个人[ave(A),ave(B),ave(C)]。

我希望这是有道理的,但希望在我离开时更清楚。

所以我试图编写一个首先启动空列表(vals)的for循环,追加每个探测列表的第一项(值),计算该位置的平均值(个体),然后将此平均值附加到一个新的清单(平均值)。

即。这是我想要的第一次averages_dict迭代后(对于每个列表中的第一个位置):

vals = [8.1, 7.8, 7.1, 6.7]

然后计算此列表的平均值并将平均值附加到新列表(平均值) 我可以轻松地使用此代码执行大部分操作:

vals = []
for item in averages_dict:
    vals.append(averages_dict[item][0])

ave_dict = dict()
i=0
for val in vals:
    i = i + val

ave = i / len(vals)

我正在努力的是,如何再次从字典的开头重新迭代,在列表的第二个位置,依此类推,以便获得每个人的最终平均列表,如如下:

averages = [7.425, 7.075, 7.3]

我意识到在上面的代码之前我可能需要某种计数器和while或for循环,但是无法弄清楚是什么?

提前致谢 - 非常感谢任何建议或帮助。

2 个答案:

答案 0 :(得分:5)

我认为你想要的是:

averages = [sum(items)/len(items)
            for items in zip(*averages_dict.values())]

这是列表理解,它的作用是:

  1. zip将字典中的每组值放在一起,这样就可以获得三个人中每个人的值列表,而不是每个探针的值;
  2. for遍历每个人;
  3. 将该个人的sum读数除以个人的读数(len);和
  4. 创建平均值列表。
  5. 我明白了:

    [7.425000000000001, 7.074999999999999, 7.3]
    

答案 1 :(得分:2)

使用for循环执行此操作的一种方法是:

avg = []
l = len(averages_dict)  #for loop easier to read/calculate len once rather than twice

for i in range(l):                       # in the example case, range is 0-2(len is 3)
    total = 0                            # initiate/re-initiate total
    for d in averages_dict:              # for each item in dict
        total += averages_dict[d][i]     # add dict[d] position i to total
    avg.append(total/l)                  # append total/len to avg
平均等于:

 [7.425000000000001, 7.074999999999999, 7.3]