我正在尝试编写一个函数,该函数将识别列表列表中的值,该值比其他列表中相同索引处的值大5倍(换句话说,该函数在一行中识别最大值并确定(如果该值是该行中所有其他值的5倍)。完成此操作后,我希望函数返回一个新的列表列表,每个列表都包含该函数在较大列表中为true的值的索引。例如,在以下列表中进行说明:
samples_avg = [[1, 12, 3], [15000, 4, 3], [1, 144, 45]]
我想要这样的输出:
filtered = [[], [0], [1,2]]
因为samples_avg中的第一个列表没有值为true
的列表,第二个列表在索引0处为真,最后一个在索引1和2处为真。
为此,我写了:
samples_avg = [[1, 12, 3], [15000, 4, 3], [1, 144, 45]]
def check(samples_avg):
filtered = []
#Find largest Value in row
maxval = [max(x) for x in zip(*samples_avg)]
#Determine if it is 5x larger than all other values in the row
maxlist = [(r >= (m/5)) for row in samples_avg for r, m in zip(row, maxval)]
#find index in each list for which maxlist is true
filtered = [z for z, y in zip(samples_avg, maxlist) if y == True]
print (maxval)
print (maxlist)
print (filtered)
out:
maxval = [15000, 144, 45]
maxlist = [False, False, False, True, False, False, False, True, True]
filtered = []
maxval
和maxlist
都能很好地找到正确的值。但是,这是找到每个列表中正确的索引的最后一步,这使我感到困惑。我为filtered
写的内容返回一个空列表。
答案 0 :(得分:0)
我希望我理解正确的问题。 “技巧”是在最大值内存储所有需要的索引。为此,我们使用元组,并在第一个索引上使用值,从该数组中将该值作为第二个索引,而在哪个迭代中将其作为第三个索引:
samples_avg = [[1, 12, 3], [15000, 4, 3], [1, 144, 45]]
out = [[] for _ in samples_avg]
for idx, v in enumerate(zip(*samples_avg)):
m = max((val, i, idx) for i, val in enumerate(v))
if all(val * 5 < m[0] for i, val in enumerate(v) if i != m[1]):
out[m[1]].extend([m[2]])
print(out)
打印:
[[], [0], [1, 2]]