【发布时间】:2023-03-23 02:39:02
【问题描述】:
好的,这是我的问题。我有一个由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]]
我需要遍历这个列表,将那些共享相同的前两个浮点数的项目与存储前应该平均第三个浮点数的项目相同。这意味着我应该检查一个项目是否已被识别为以前重复,因此我不会再次将其识别为新项目。
为了更清楚地理解我的意思,这是处理列表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])中被标识了三次,因此它与第三次浮点数的平均值一起存储((0.7+0.3+1.)/3. = 0.67)。第二项在a 中没有重复,因此按原样存储。第三个项目在a(a[2] 和a[8])中被发现两次,并以第三个浮点数的平均值存储((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 风格)。
【问题讨论】:
-
这在 codereview.stackexchange.com 上可能会更好。
-
您需要
a_processed中的特定订单吗?或者任何元素顺序都可以? -
任何订单都可以,我可以稍后重新排列。