0

例えば

alist = [[1,2],[10,10],[5,5]]

各リスト [nth] 要素とリスト [n+1] 要素の平均を持つ新しいリストを作成したいと考えています。ここで、n はリストのサイズです。ステップが2の場合、range([start]、stop、[step])のステップから期待される動作が必要です。

目的の出力から逆方向に作業する

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

私はこれを機能させるためにいくつかの道をたどりましたが、解決策にたどり着くことはありませんでした。iterators モジュールの何かが役立つはずだと思います。

助言がありますか?

4

2 に答える 2

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]]
于 2012-08-14T03:57:20.090 に答える
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]]
于 2012-08-14T04:34:27.917 に答える