减少元组列表并生成平均值(是 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
我是一个 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