【问题标题】:complicated iteration through a dictionary通过字典进行复杂的迭代
【发布时间】:2013-12-24 11:42:09
【问题描述】:

我是 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)]。

我希望这是有道理的,但希望我会更清楚。

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

即这是我在第一次 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 循环,但不知道是什么?

在此先感谢 - 任何建议或帮助将不胜感激。

【问题讨论】:

  • 字体是怎么回事?
  • 那应该是带有 cmets 的代码吗?您需要选择文本并点击代码格式按钮(带有大括号的按钮)才能正确显示代码。
  • 是的。感谢 user2357112 和 falsetru。

标签: python list dictionary iteration


【解决方案1】:

我想你想要的是:

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

这是一个列表推导,它的作用是:

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

我明白了:

[7.425000000000001, 7.074999999999999, 7.3]

【讨论】:

  • 你摇滚!!不知道 zip 功能,并且会带我 AGES 自己解决这个问题。非常感谢! :)
【解决方案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]

【讨论】:

  • 太棒了!非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2021-03-06
  • 2016-07-27
  • 2019-04-30
  • 2014-04-10
  • 2015-10-04
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多