按照列表中第一项分组,计算列表中元素的平均值

3
我的列表看起来像 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] 我不介意得到一个字典或其他什么东西,但我更希望它保持为一个列表。
我尝试了以下方法: 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)} 将原始列表拆分,使第一列成为键,第二列和第三列成为值,并将其转换为字典,这样可以给出总数,但问题是 我想要保留小数位,它会四舍五入并给我整数而不是浮点值 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. Converted the second and third columns to float maybe using a for loop thinking, then it will give me a float when I convert it to a dictionary.. But no difference, IT ROUNDS UP and gives a A WHOLE NUMBER.

    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_list 是一个元组(tuple),而不是列表(list)... - juanpa.arrivillaga
你在Python 2中尝试获取浮点数,但却得到整数?如果是这种情况,你需要在除法中使用浮点数。尝试类似于['A', (6+4)/2.0 ,(7+8)/2.0]的代码。 - T4rk1n
2个回答

3

假设您想要使用以下列表:

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 中的版本不够干净。

最后,Python 2 中没有 statistics 模块。因此请执行以下操作:

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

使用该mean替代statistics.mean


是的,我现在已经编辑过了,所以我改变了括号的不一致性;我会尝试你的方法并告诉你结果。 - user8508347
File "<ipython-input-16-9a30058da39f>", line 5 for k, *tail in my_list: ^ SyntaxError: invalid syntax - user8508347
@Abhishek 添加了一个 Python 2 兼容版本。 - juanpa.arrivillaga
现在它显示“没有名为statistics的模块”。我最好更新Python.. 我认为那个模块已经被人们所谓的“弃用”了。 - user8508347
@Abhishek 不,statistics是全新的品牌。Python 2才是已弃用的版本。如果你有充分的理由必须使用Python 2(例如老板要求、需要维护Python 2代码库等),那么可以使用Python 2,否则应该使用Python 3。 - juanpa.arrivillaga
我希望你在生活中取得巨大的成功。没有你,我不知道该怎么办。我是一名学生,正在尝试第一次实现K-means聚类算法。 - user8508347

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]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接