例如
alist = [[1,2],[10,10],[5,5]]
我想创建一个新列表,其中包含每个列表[nth]元素和列表[n + 1]元素的平均值。其中n是列表的大小。如果步骤为2,我希望它具有您在步骤范围内所期望的行为([开始],停止,[步骤])。
从所需的输出向后工作
output = [[5.5,6],[5,5]]
output = [[(1 + 10)/2 , (2 + 10)/2], [5,5]] # The last list has no matching list, so it remains unchanged
output = [[(alist[0][0] + alist[1][0]) / 2, (alist[0][1] + alist[1][1]) / 2), alist[2],alist[2]
output = alist[nth ][yth] + alist[n + 1][y + 1] ....
我走了几条路,试图做这项工作,从来没有找到解决方案。我觉得迭代器模块中的某些内容应该会有所帮助。
有什么建议吗?
答案 0 :(得分:3)
>>> [[(x+y)*.5 for x,y in zip(*item)] for item in zip(alist, alist[1:])]
[[5.5, 6.0], [7.5, 7.5]]
您可以使用itertools
创建更具内存效率的版本>>> from itertools import izip, islice
>>> [[(x+y)*.5 for x,y in izip(*item)] for item in izip(alist, islice(alist,1,None))]
[[5.5, 6.0], [7.5, 7.5]]
编辑:仍然不确定OP对一般情况的要求,但这里有几个替代方案
>>> alist = [[1,2],[10,10],[5,5]]
>>> if len(alist)%2:
... alist.append(alist[-1])
...
>>> [[(x+y)*.5 for x,y in zip(*item)] for item in zip(alist, alist[1:])]
[[5.5, 6.0], [7.5, 7.5], [5.0, 5.0]]
>>> [[(x+y)*.5 for x,y in zip(*item)] for item in zip(alist[::2], alist[1::2])]
[[5.5, 6.0], [5.0, 5.0]]
答案 1 :(得分:0)
为什么不是易读的版本?
alist = [[1,2],[10,10],[5,5]]
output = []
for i in range(0, len(alist) - 2):
avg1 = (alist[i][0] + alist[i + 1][0]) / 2.0
avg2 = (alist[i][1] + alist[i + 1][1]) / 2.0
output.append([avg1, avg2]) # append averages
output.append([1.0 * j for j in alist[-1])
# append final list as a list of floats ([5.0, 5.0] in this case)
>>> output
[[5.5, 6.0], [5.0, 5.0]]