さて、これが私の問題です。それぞれ要素(フロート)N
で構成されるサブリストで構成されるリストがあります。M
したがって、一般的な形式では次のようになります。
a_list = [b_list_1, b_list_2, ..., b_list_N]
と:
b_list_i = [c_float_1, c_float_2, ..., c_float_M]
この例では を想定N=9 ; M=3
しているため、リストは次のようになります。
a = [[1.1, 0.5, 0.7], [0.3, 1.4, 0.2], [0.6, 0.2, 1.], [1.1, 0.5, 0.3], [0.2, 1.1, 0.8], [1.1, 0.5, 1.], [1.2, 0.3, 0.6], [0.6, 0.4, 0.9], [0.6, 0.2, 0.5]]
このリストをループして、同じ最初の 2 つのフロートを共有するアイテムを、3 番目のフロートを格納する前に平均化する必要がある同じアイテムとして特定する必要があります。これは、アイテムが以前に繰り返されているとすでに識別されているかどうかを確認する必要があることを意味します。そのため、新しいアイテムとして再度識別しません。
私の言いたいことをより明確にするために、処理リストの出力は次のa
ようになります。
a_processed = [[1.1, 0.5, 0.67], [0.3, 1.4, 0.2], [0.6, 0.2, 0.75], [0.2, 1.1, 0.8], [1.2, 0.3, 0.6], [0.6, 0.4, 0.9]]
この新しいリストの最初の項目は ( a[0]
、a[3]
およびa[5]
) で 3 回識別されたため、3 番目の float の平均 ( (0.7+0.3+1.)/3. = 0.67
) で格納されたことに注意してください。2番目のアイテムは繰り返されなかったa
ので、そのまま保管されていました。3 番目の項目はa
(a[2]
およびa[8]
) で 2 回検出され、3 番目の float を平均化して格納されました ( (1.+0.5)/2.=0.75
)。新しいリストの残りの項目は、繰り返されたものとして検出されなかったa
ため、変更なしで保存されました。
リストをループしながら更新/変更することはお勧めできないことを知っているので、いくつかの一時リストを使用することにしました。これは私が思いついたコードです:
import numpy as np
a = [[1.1, 0.5, 0.7], [0.3, 1.4, 0.2], [0.6, 0.2, 1.], [1.1, 0.5, 0.3],
[0.2, 1.1, 0.8], [1.1, 0.5, 1.], [1.2, 0.3, 0.6], [0.6, 0.4, 0.9],
[0.6, 0.2, 0.5]]
# Final list.
a_processed = []
# Holds indexes of elements to skip.
skip_elem = []
# Loop through all items in a.
for indx, elem in enumerate(a):
temp_average = []
temp_average.append(elem)
# Only process if not found previously.
if indx not in skip_elem:
for indx2, elem2 in enumerate(a[(indx+1):]):
if elem[0] == elem2[0] and elem[1] == elem2[1]:
temp_average.append(elem2)
skip_elem.append(indx2+indx+1)
# Store 1st and 2nd floats and averaged 3rd float.
a_processed.append([temp_average[0][0], temp_average[0][1],
round(np.mean([i[2] for i in temp_average]),2)])
このコードは機能しますが、これを行うためのよりエレガントで Pythonic な方法があるかどうか疑問に思っています。そのままでは複雑すぎるように見えます(Fortran風だと思います)。