列表内容的均值
我有一个这样的列表:
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 个回答
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]
3
列表推导式很不错,但我最喜欢的Python技巧是 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))
。
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)