列表内容的平均值

时间:2011-11-13 14:21:52

标签: python arrays average

我有一个如下列表:

mylist = [('a', [(0,1), (1,2), (2,3)]),
         ('b', [(0,1), (1,2), (2,3)]),
         ('c', [(0,1), (1,2), (2,3)])]

我在代码中的不同操作后得到的。

是否可以获得如下输出?

newlist = [('a', [0.5, 1.5, 2.5]),
          ('b', [0.5, 1.5, 2.5]),
          ('c', [0.5, 1.5, 2.5])]

输入列表的内容为范围,输出列表是通过取每个范围中两个数字的平均值生成的。谢谢。

3 个答案:

答案 0 :(得分:4)

>>> l = [('a', [(0,1), (1,2), (2,3)]),
... ('b', [(0,1), (1,2), (2,3)]),
... ('c', [(0,1), (1,2), (2,3)])]
>>> newl = [(i[0], [(j[0]+j[1])/2 for j in i[1]]) for i in l]
>>> newl
[('a', [0.5, 1.5, 2.5]), ('b', [0.5, 1.5, 2.5]), ('c', [0.5, 1.5, 2.5])]

这适用于Python 3;在Python 2中,您需要

>>> newl = [(i[0], [(j[0]+j[1])/2.0 for j in i[1]]) for i in l]

这些列表推导等同于以下更详细的代码:

>>> newl = []
>>> for i in l:
...     temp = (i[0], [])
...     for j in i[1]:
...         temp[1].append((j[0]+j[1])/2.0)
...     newl.append(temp)

答案 1 :(得分:3)

列表推导很好,但我最喜欢的Pythonic技术是map(),它将一个函数应用于结构的每个元素:

ls = (('a', [(0,1), (1,2), (2,3)]),
      ('b', [(0,1), (1,2), (2,3)]),
      ('c', [(0,1), (1,2), (2,3)]))

for li in ls:
    print(li[0], list(map(lambda x: sum(x)/len(x), li[1])))

Tim说,这适用于Python 3,Python 2需要float(len(x))

答案 2 :(得分:2)

要仅使用其中一个列表(有效的python部分),您可以使用列表解析:

numbers = [(0,1), (1,2), (2,3)]

print [sum(x) / float(len(x)) for x in numbers]

这应该让你朝着正确的方向前进,并给你:

[0.5, 1.5, 2.5]