我有一个如下列表:
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])]
输入列表的内容为范围,输出列表是通过取每个范围中两个数字的平均值生成的。谢谢。
答案 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]