【问题标题】:Average of elements in a list of list grouped by first item in the list按列表中的第一项分组的列表列表中元素的平均值
【发布时间】:2018-02-01 16:54:09
【问题描述】:

我的列表看起来像my_list = [['A', 6, 7], ['A', 4, 8], ['B', 9, 3], ['C', 1, 1]], ['B', 10, 7]]

我想查找每个内部列表中其他两列的平均值,按每个内部列表中的第一列分组。

[['A', 5, 7.5], ['B', 9.5, 5], ['C', 1, 1]]

['A', 5, 7.5]来自['A', (6+4)/2 ,(7+8)/2]

我不介意我最终会得到一本字典或其他东西,但我希望它仍然是一个列表。

我尝试了以下方法:


  1. my_list1 = [i[0] for i in my_list] my_list2 = [i[1:] for i in my_list] new_dict = {k: v for k, v in zip(my_list1, my_list2)}

拆分原始列表,使第一列成为 KEY,第二列和第三列成为 VALUE,将其转换为字典将为您提供聚合,但问题是

我想保留小数位,四舍五入并给我整数而不是浮点值

my_list1 = ['A', 'A', 'B', 'C', 'B']

my_list2 = [[6, 7], [4, 8], [9, 3], [1, 1], [10, 7]]

new_dict= {'A': [5, 8], 'B': [10, 5], 'C': [1, 1]}

当我最理想的情况是,[['A', 5, 7.5], ['B', 9.5, 5], ['C', 1, 1]](不介意它是一本字典)


  1. 可能使用 for 循环思维将第二列和第三列转换为浮点数,然后当我将其转换为字典时它会给我一个浮点数。但没有区别,它向上取整并给出一个整数。

    for i in range(0, len(my_list)):
      for j in range(1, len(my_list[i])):
        my_list[i][j].astype(float)
    
    dict = {}
    
    for l2 in my_list:
      dict[l2[0]] = l2[1:]
    

我需要保留小数位的原因是因为第二列和第三列是指 x 和 y 坐标..

因此,总而言之,目标是找到每个内部列表中其他两列的平均值,这些内部列表由每个内部列表中的第一列分组,尽可能多的小数位

【问题讨论】:

  • my_listtuple,不是列表...
  • 您试图获得浮点数但在 python 2 中获得 int ?如果是这种情况,您的部门需要浮动。试试['A', (6+4)/2.0 ,(7+8)/2.0]

标签: python list dictionary list-comprehension dictionary-comprehension


【解决方案1】:

同样使用itertools.groupby

import operator as op 
import itertools as it
import statistics as stats


iterables = [['A', 6, 7], ['A', 4, 8], ['B', 9, 3], ['C', 1, 1], ['B', 10, 7]]
groups = it.groupby(sorted(iterables), op.itemgetter(0))
{k: list(map(stats.mean, zip(*[i[1:] for i in g]))) for k, g in groups}
# {'A': [5, 7.5], 'B': [9.5, 5], 'C': [1, 1]}

【讨论】:

    【解决方案2】:

    假设您打算使用以下列表:

    In [4]: my_list = [['A', 6, 7], ['A', 4, 8], ['B', 9, 3], ['C', 1, 1], ['B', 10, 7]]
    

    只需使用defaultdict按第一个元素分组,然后找到mean

    In [6]: from collections import defaultdict
    
    In [7]: grouper = defaultdict(list)
    
    In [8]: for k, *tail in my_list:
        ...:     grouper[k].append(tail)
        ...:
    
    In [9]: grouper
    Out[9]:
    defaultdict(list,
                {'A': [[6, 7], [4, 8]], 'B': [[9, 3], [10, 7]], 'C': [[1, 1]]})
    
    In [10]: import statistics
    
    In [11]: {k: list(map(statistics.mean, zip(*v))) for k,v in grouper.items()}
    Out[11]: {'A': [5, 7.5], 'B': [9.5, 5], 'C': [1, 1]}
    

    注意,如果您使用的是 Python 2,则无需在 map 之后调用 list。另外,您应该使用iteritems 而不是items

    此外,您还必须执行以下操作:

    for sub in my_list:
        grouper[sub[0]].append(sub[1:])
    

    而不是 Python 3 上的更简洁的版本。

    最后,Python 2 中没有 statistics 模块。所以就这样做吧:

    def mean(seq):
        return float(sum(seq))/len(seq)
    

    并使用 mean 而不是 statistics.mean

    【讨论】:

    • 是的,我现在对其进行了编辑,因此我更改了括号差异;我会试试你的,然后告诉你。
    • File "<ipython-input-16-9a30058da39f>", line 5 for k, *tail in my_list: ^ SyntaxError: invalid syntax
    • @Abhishek 添加了 Python 2 兼容版本。
    • 现在显示No module named statistics。我最好更新 Python .. 我认为这个模块就是人们所说的“贬低”
    • @Abhishek 不,statistics 是全新的品牌。 不推荐使用的是 Python 2。如果您出于某些充分的理由必须使用 Python 2(例如,您的老板让您,您有 Python 2 代码库要维护等),那么很好,否则,您应该使用 Python 3。
    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 2020-07-12
    • 2011-11-30
    相关资源
    最近更新 更多