【问题标题】:In list of lists, how to find average of values associated with inner lists?在列表列表中,如何找到与内部列表关联的值的平均值?
【发布时间】:2020-10-29 07:40:45
【问题描述】:

我有一个这样的列表

l=[[Alex,12],[John,14],[Ross,24],[Alex,42],[John,24],[Alex,45]]

我应该如何处理这个列表,我得到这样的输出

l=[[Alex,33],[John,19],[Ross,24]]

这基本上是每个名字的平均分数。

【问题讨论】:

    标签: python arrays list arraylist


    【解决方案1】:

    使用 pandas 按名称分组并计算平均值(l 是您的列表):

    import pandas as pd
    df = pd.DataFrame(l,columns=['name','value'])
    l = df.groupby('name').value.mean().reset_index().values.tolist()
    

    df:

       name  value
    0  Alex     12
    1  John     14
    2  Ross     24
    3  Alex     42
    4  John     24
    5  Alex     45
    

    输出:

    [['Alex', 33], ['John', 19], ['Ross', 24]]
    

    【讨论】:

    • 感谢 ehsan ..我无法得到 Dataframe(l,columns=[]) 中的“l”是什么
    • @VivekAnand 它是l,你的名单有问题。我使用了有问题的命名并添加了编辑以使其更清晰。如果可以的话,请查看stackoverflow.com/help/someone-answers 以了解如何接受答案。谢谢
    • 确实有效,非常感谢.....如果我有像这样的三列 columns=['name','value','value1'] 并且我有也找到 value1 的平均值
    • df = pd.DataFrame(l,columns=['name','value','value1']) 然后l = df.groupby('name')['value','value1'].mean().reset_index().values.tolist()
    【解决方案2】:
    l = [['Alex',12],['John',14],['Ross',24],['Alex',42],['John',24],['Alex',45]]
    
    score_dict = {}
    
    for l_score in l:
        name = l_score[0]
        score = l_score[1]
        if name in score_dict.keys():
            score_dict[name].append(score)
            
        else:
            score_dict[name] = [score]
    
    ret_list = []
    for k, v in score_dict.items():
        sum_l = sum(v)
        len_l = len(v)
        if len_l > 0:
            avg = float(sum_l)/float(len_l)
        else:
            avg = 0
        ret_list.append([k,avg])
        
    print(ret_list)
    

    这应该返回以下列表:

    [['Ross', 24.0], ['Alex', 33.0], ['John', 19.0]]
    

    我没有使用任何包,因为您的代码示例中没有导入。可以用 numpy 或 pandas 来简化

    【讨论】:

    • 谢谢你的回答..你能建议一个更短的包裹方式
    【解决方案3】:

    让我们通过构造新的dict 来简化问题,其中键是名称或内部列表的第一个元素,值是平均值。由于键在 python dicts 中是唯一的,这变得很容易。完成此操作后,我们将从构造的 dict 生成一个新列表,这将是我们的答案。

    TheOriginalList=[[Alex,12],[John,14],[Ross,24],[Alex,42],[John,24],[Alex,45]] 
    
    aux_dict = {}
    for inner_list in TheOriginalList:
        if not aux_dict.get(inner_list[0],None):           #_1_
            aux_dict[inner_list[0]]=[inner_list[1],1]      #_2_
        else:
            aux_dict[inner_list[0]][0]+= inner_list[1]     #_3_
            aux_dict[inner_list[0]][1]+= 1                 #_4_
    
    
    final_list = []
    for k,v in aux_dict.items():                           #_5_
        final_list.append([k,v[0]/v[1]])                   #_6_
    
    

    解释

    1. 在#1中,我们试图获取key,即person name,如果它已经存在于字典中,我们将得到它的值,即list of 2 int items[acumaltive_score , counter]这会将我们发送到 #3。如果不是,我们输入 #2
    2. 这里我们添加key(字典中的人名)并将其值设置为新的2个项目列表[current_score, 1]1是第一个分数。它是counter,我们稍后需要它来进行average 计算。
    3. 我们来到这里#3,因为这个人已经存在于字典中。因此我们将其当前分数添加到分数中,并在 #4 中将计数器加 1。
    4. 我们解释一下(计数器加 1)
    5. 在#5中,我们迭代了字典keysitems,所以我们在每次迭代中得到key(人名)和value(2个项目的列表,第一项是total score,第二项是number of the scores)。
    6. 在 #6 中,我们构建了最终列表,方法是附加一个新列表(同样是 2 个项目的列表,在 0 index 中是当前键的人名,在 @987654340 @平均值是v[0]/v[1]

    请记住,此代码在某些情况下会引发异常。考虑使用try-except

    【讨论】:

    • @VivekAnand - 你会来的。我喜欢你的问题。它让我想到了没有if-else 旧学校代码的pythonic 解决方案。如果你觉得它有用,我会很高兴你接受它。再次感谢:-)
    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2016-06-14
    • 2021-09-30
    • 2014-08-20
    相关资源
    最近更新 更多