Python中求不同长度的多个列表平均值的最快方法

2024-05-15 04:13:21 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一些来自Mongo的清单,上面有预先计算的值(按商店的产品平均价格)。每一张单子代表一周的不同产品。清单的大小可能不同,因为有时一个产品在一周内没有售出。商店平均价格的子列表在两个不同的星期内也可能有不同的大小,因为有些商店可能缺货(因此没有此产品的任何价格)。你知道吗

有没有一种方法可以在不生成许多for循环的情况下获得我的结果?你知道吗

下面是一个需要两周时间澄清的例子:

第1周

[{u'_id': 193390, u'avgT': 12, u'avgByS': [{u'S': 7, u'avg': 12}]}, {u'_id': 193396, u'avgT': 29, u'avgByS': [{u'S': 7, u'avg': 29}, {u'S': 5, u'avg': 29}]}]

第2周

[{u'_id': 193390, u'avgT': 11, u'avgByS': [{u'S': 7, u'avg': 10}, {u'S': 9, u'avg': 12}]}, {u'_id': 193398, u'avgT': 15, u'avgByS': [{u'S': 7, u'avg': 29}, {u'S': 5, u'avg': 29}]},{u'_id': 193396, u'avgT': 29, u'avgByS': [{u'S': 7, u'avg': 29}, {u'S': 5, u'avg': 29}]}]

期望输出

[{u'_id': 193390, u'avgT': 11.5, u'avgByS': [{u'S': 7, u'avg': 11}, {u'S': 9, u'avg': 12}]}, {u'_id': 193398, u'avgT': 15, u'avgByS': [{u'S': 7, u'avg': 29}, {u'S': 5, u'avg': 29}]},{u'_id': 193396, u'avgT': 29, u'avgByS': [{u'S': 7, u'average': 29}, {u'S': 5, u'average': 29}]}]

Tags: 方法id列表产品mongo代表价格商店
1条回答
网友
1楼 · 发布于 2024-05-15 04:13:21

Is there a way to obtain my Result without making many for loops ?

不是。您的数据结构是列表中的列表。如果没有。。。迭代。你知道吗

但是嵌套for循环并不总是一个坏主意!一些嵌套for循环导致O(N^2)行为,但是一些嵌套for循环导致O(N)行为,这取决于实际代码。你知道吗

这里有一种计算数据的方法。注意,它有三个嵌套for循环。你无法避免。但是没有一个嵌套循环导致多项式复杂性。我对big-O有些生疏,但是我声明下面程序中的聚合循环以O(N)运行,其中N是avgByS列表中的值的总数。(第二个循环的复杂度将与第一个循环相同,但我对结果调用sorted())。这可能会减慢速度。)

from __future__ import division
from pprint import pprint

weeks = [
    [{u'_id': 193390, u'avgT': 12, u'avgByS': [{u'S': 7, u'avg': 12}]}, {u'_id': 193396, u'avgT': 29, u'avgByS': [{u'S': 7, u'avg': 29}, {u'S': 5, u'avg': 29}]}],
    [{u'_id': 193390, u'avgT': 11, u'avgByS': [{u'S': 7, u'avg': 10}, {u'S': 9, u'avg': 12}]}, {u'_id': 193398, u'avgT': 15, u'avgByS': [{u'S': 7, u'avg': 29}, {u'S': 5, u'avg': 29}]},{u'_id': 193396, u'avgT': 29, u'avgByS': [{u'S': 7, u'avg': 29}, {u'S': 5, u'avg': 29}]}]
]

# First, accumlate the data. Convert lists to dicts.
total = {}
for week in weeks:
    for product in week:
        total_product = total.setdefault(
            product['_id'],
            {
                u'_id':product['_id'],
                u'avgT':[],
                u'avgByS':{}
            })
        total_product['avgT'].append(product['avgT'])
        for store in product['avgByS']:
            total_product['avgByS'].setdefault(store['S'],[]).append(store['avg'])
pprint (total)

# Next, convert dicts to lists and compute averages.
averages = [{
    u'_id': k,
    u'avgT': sum(v['avgT'])/len(v['avgT']),
    u'avgByS': [{
        u'S': kk,
        u'avg': sum(vv)/len(vv),
        }
        for kk,vv in sorted(v['avgByS'].items())]
    }
    for k,v in sorted(total.items())]
pprint(averages)

相关问题 更多 >

    热门问题