【问题标题】:Python Dictionary - find average of value from other valuesPython Dictionary - 从其他值中查找平均值
【发布时间】:2017-07-07 16:29:04
【问题描述】:

我有以下列表

count = 3.5, price = 2500

count = 3, price = 400

count = 2, price = 3000

count = 3.5, price = 750

count = 2, price = 500

我想找到计数相同的所有产品的平均价格。例如:

count = 2, price = 3000

count = 2, price = 500

3000 + 500 = 3500

3500/2 = 1750

“计数 2”的平均值为 1750

这是我目前的代码

avg_list = [value["average"] for value in dictionary_database_list] 

counter_obj = collections.Counter(count_list)

print ("AVG:")

for i in counter_obj:

    print (i, counter_obj[i])

【问题讨论】:

  • “字典”标签看起来是个不错的开始——到目前为止,您尝试过什么?
  • 代码简单!想想再努力一点,你会做到的! :)
  • 如果有一个函数可以通过共享密钥分组项目!哦,等等,there is!
  • 我可以得到一个对象的计数。所以我能够将 count = 2 出现的次数加起来。但我不知道如何将其与价格价值进行比较。这就是我所拥有的
  • @KernelPanic True。但这归结为“对数据进行排序”,因为分组是 groupby 所做的,并且无论如何都必须计算平均值。 (打电话给statistics.mean() 也不是那么难,是吗?)

标签: python dictionary find average


【解决方案1】:

我承认我不是 100% 清楚你在这里寻找什么,但我会试一试:

当您想要遍历“事物”列表并积累有关“相同事物”的某种信息时,一个好的策略是使用哈希表。在 Python 中,对于需要哈希表的算法,我们通常使用 dict

要收集足够的信息以获取列表中每件商品的平均价格,我们需要:

a) 具有特定“计数”的项目总数

b) 具有特定“计数”的商品的总价格

因此,让我们构建一个数据结构,将“count”映射到包含具有该“count”的项目的“total items”和“total price”的dict。

让我们采用以下格式输入:

item_list = [
    {'count': 3.5, 'price': 2500},
    {'count': 3, 'price': 400},
    {'count': 2, 'price': 3000},
    {'count': 3.5, 'price': 750},
    {'count': 2, 'price': 500},
]

现在让我们在名为items_by_countdict 中映射有关“总项目”和“总价格”的信息:

for item in item_list:
    count, price = item['count'], item['price']
    items_by_count[count]['total_items'] += 1
    items_by_count[count]['total_price'] += price

但是等等! 如果count 不在字典中,items_by_count[count] 将抛出 KeyError。这是defaultdict 的一个很好的用例。让我们将我们以前从未见过的 count 的默认值定义为 0 总价格和 0 总项目:

from collections import defaultdict
items_by_count = defaultdict(lambda: {
    'total_items': 0,
    'total_price': 0
})

现在我们的代码不会在每次看到 count 的新值时抛出异常。

最后,我们需要实际取平均值。让我们在另一个dict 中获取我们需要的信息,将计数映射到平均价格。这是dict comprehension 的一个很好的用例:

{count: item['total_price'] / item['total_items']
for count, item in items_by_count.iteritems()}

这会遍历 items_by_count 字典并创建我们想要的新字典。

把它们放在一起:

from collections import defaultdict

def get_average_price(item_list):
    items_by_count = defaultdict(lambda: {
        'total_items': 0,
        'total_price': 0
    })

    for item in item_list:
        count, price = item['count'], item['price']
        items_by_count[count]['total_items'] += 1
        items_by_count[count]['total_price'] += price

    return {count: item['total_price'] / item['total_items']
            for count, item in items_by_count.iteritems()}

如果我们传入我们的示例输入字典,这个函数会返回: {3.5: 1625, 2: 1750, 3: 400}

希望这是您想要的输出!在您的特定 Python 版本中注意 float division 之类的陷阱。

【讨论】:

  • 这正是我一直在寻找的,而且效果很好!!你太棒了!
【解决方案2】:

你需要迭代你的项目

See documentation

  • avg(dictionary.values()) 可能就是你想要的

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 我虽然可以帮助发布一个方法,因为@phunsukwangdu 发表评论,然后也为我投票。 '简单的代码'。 PD:我从 python 官方文档中发布了一个永久链接。可能会发生变化,但删除一个如此常见的方法...idts
  • 我还是很迷茫这个...不知道如何实现 avg(dictionary.values())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2021-12-22
  • 2018-06-23
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多