将真实值的索引过滤到列表中

时间:2019-07-11 14:23:10

标签: python list loops

我正在尝试编写一个函数,该函数将识别列表列表中的值,该值比其他列表中相同索引处的值大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 = []

maxvalmaxlist都能很好地找到正确的值。但是,这是找到每个列表中正确的索引的最后一步,这使我感到困惑。我为filtered写的内容返回一个空列表。

1 个答案:

答案 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]]