减少元组列表并生成平均值(是 pythonic!)

Reducing list of tuples and generating mean values (being pythonic!)

我是一个 Python 初学者,我写了一些有效的代码(在最后显示),但我更愿意学习一种 pythonic 方式来做到这一点。

我有一个元组列表列表,如下所示。每个列表中可能有 1 到 6 个元组。我想确定每个列表中三个数值的平均值,最后每个列表中只有一个元组,所以类似于第二个片段。

[
    [
        ("2022-02-21 20:30:00", None, 331.0),
        ("2022-02-21 21:00:00", None, 324.0),
        ("2022-02-21 21:30:00", None, 298.0),
    ],
    [
        ("2022-02-21 22:00:00", None, 190.0),
        ("2022-02-21 22:30:00", None, 221.0),
        ("2022-02-21 23:00:00", None, 155.0),
    ],
    [
        ("2022-02-21 23:30:00", None, 125.0),
        ("2022-02-22 00:00:00", None, 95.0),
        ("2022-02-22 00:30:00", None, 69.0),
    ],
]
[
    [
        ("2022-02-21 20:30:00", None, 317.7),
    ],
    [
        ("2022-02-21 22:00:00", None, 188.7),
    ],
    [
        ("2022-02-21 23:30:00", None, 96.3),
    ],
]
for li in data:
    li = [list(t) for t in li]
    sum = 0

    for t in li:
        sum = sum + t[tuple_idx]

    mean = sum / len(li)

    li[0][tuple_idx] = mean

    new_data.append(tuple(li[0]))

data = new_data

这可能是你能得到的最 pythonic:

from statistics import fmean

result = [
    [(*x[0][:-1], fmean(map(lambda y: y[2], x)))] for x in inputs
]

如果需要,可以将方括号放在推导式中,将其展平为元组列表。

我不会尝试让它更像 pythonic 或更短但更易读。

所以我会保留你的版本,只做一些小改动。

首先我会使用有意义的名字。

还有函数 sum() 所以我不会将它用作变量。

new_data = []

value_idx = 2

for group in data:
    
    total_sum = sum(item[value_idx] for item in group) 
    mean = total_sum / len(group)
    
    first_item = list(group[0])    
    first_item[value_idx] = mean
    
    new_data.append( [tuple(first_item)] )

data = new_data