Фильтрация индекса истинных значений в списки - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь написать функцию, которая будет идентифицировать значения в списке списков, которые в 5 раз больше, чем значения с тем же индексом в другом списке (другими словами, внутри строки функция определяет наибольшее значение и определяетесли это значение в 5 раз больше, чем все остальные значения в строке).После этого я бы хотел, чтобы функция возвращала новый список списков, каждый из которых содержал индекс значений, для которых функция была истинной в большом списке.Для пояснения, например, в списке, подобном этому:

samples_avg = [[1, 12, 3], [15000, 4, 3], [1, 144, 45]]

Я бы хотел вывод, подобный этому:

filtered = [[], [0], [1,2]]

, потому что первый список в samples_avg не имеет значений, для которых онравно true, второе значение true для индекса 0, а последнее значение true для индексов 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, возвращает пустой список.

1 Ответ

0 голосов
/ 11 июля 2019

Надеюсь, я правильно понял проблему. «Хитрость» - хранить все необходимые индексы в пределах максимального значения. Для этого мы используем кортеж со значением по первому индексу, из которого массив является этим значением в качестве второго индекса и с какой итерацией мы в качестве третьего индекса:

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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...