【问题标题】: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

标签: python list average mean


【解决方案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)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 2021-06-03
    相关资源
    最近更新 更多