根据元组的值对元组列表中的重复元组进行平均

Posted

技术标签:

【中文标题】根据元组的值对元组列表中的重复元组进行平均【英文标题】:Averaging the duplicate tuples from list of tuples based on their values 【发布时间】:2021-10-08 16:05:50 【问题描述】:

我有一个元组列表如下:

lst:
    [(1, 1, 18), (1, 1, 19), (1, 2, 7), (1, 2, 8), (1, 3, 31), (1, 4, 11), (1, 4, 15),(1, 5, 3)]

我想获得两个第一项相似的元组的平均值。所以从上面的例子中,我想要的输出是:

out_lst:
    [(1, 1, 18.5), (1, 2, 7.5), (1, 3, 31), (1, 4, 13), (1,5,3)]

【问题讨论】:

当您尝试编写代码来解决问题时发生了什么?你会如何用纸和铅笔解决这个问题?请阅读How to Ask。 【参考方案1】:

你可以试试这样的,这不是很有效,但它会做的伎俩

input_list = [(1, 1, 18), (1, 1, 19), (1, 2, 7), (1, 2, 8), (1, 3, 31), (1, 4, 11), (1, 4, 15),(1, 5, 3)]

compute_dic = 
for elem in input_list:
    compute_dic.setdefault((elem[0], elem[1]), []).append(elem[2])

out = [(k[0], k[1], sum(v)/len(v)) for k,v in compute_dic.items()]

print(out)

【讨论】:

你可以用compute_dic.setdefault((elem[0], elem[1]), []).append(elem[2])代替for里面的5行【参考方案2】:

您可以使用 itertools.groupby 和 statistics.mean

import itertools
import statistics
keyfunc = lambda kk: (kk[0],kk[1])
by_two = itertools.groupby( sorted( lst, key= keyfunc ) , key= keyfunc )
our_lst = [ ( kk[0], kk[1], statistics.mean( map(lambda tp: tp[2], vv) ) ) for kk,vv in by_two ]

print(our_lst)
# print [(1, 1, 18.5), (1, 2, 7.5), (1, 3, 31), (1, 4, 13), (1, 5, 3)]

【讨论】:

以上是关于根据元组的值对元组列表中的重复元组进行平均的主要内容,如果未能解决你的问题,请参考以下文章

如何根据某些文本标准对元组列表进行分组/存储?

根据第三个参数对元组列表进行排序[重复]

基本数据类型____元组

基本数据类型____元组

按元组的第二个元素对元组列表进行排序,无需高阶函数或递归

按第二个值对元组列表进行排序,reverse=True,然后按 key,reverse=False