按列表中的第一项分组的列表列表中的元素的平均值

时间:2017-08-23 23:55:33

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

我的列表看起来像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)}
  2. 拆分原始列表因此第一列变为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. 将第二列和第三列转换为float可能使用for循环思考,然后当我将其转换为字典时它会给我一个浮点数。但没有区别,IT ROUNDS UP并给出一个整数

      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:]
      
    2. 我需要保留小数位的原因是因为第二列和第三列引用了x和y坐标..

      所有目标都是找到每个内部列表中每个内部列表中其他两列的平均值,每个内部列表中的第一列包含尽可能多的小数位数

2 个答案:

答案 0 :(得分:3)

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

<input id="input">

只需使用Documents.Add DocumentType:=wdNewBlankDocument 按第一个元素分组,然后找到In [4]: my_list = [['A', 6, 7], ['A', 4, 8], ['B', 9, 3], ['C', 1, 1], ['B', 10, 7]]

defaultdict

注意,如果您使用的是Python 2,则无需在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]} 。此外,您应该使用list代替map

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

iteritems

而不是Python 3上更干净的版本。

最后,Python 2中没有items模块。所以只需执行:

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

并使用statistics代替def mean(seq): return float(sum(seq))/len(seq)

答案 1 :(得分:0)

同样使用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]}