2016-08-15 2 views
0

У меня есть список списков, которые я преобразованы в Numpy массив:возвращая элемент в одном списке на основе индекса и максимальное значение элемента в другом списке

lsts = ([[1,2,3], ['a','b','a']], 
     [[4,5,6,7], ['a','a','b','b']], 
     [[1,2,3],['b','a','b']]) 

np_lsts = np.array(lsts) 

Я хочу вернуть наибольший элемент в первом списке, где a 'b' встречается во втором списке. Я думаю, что мне нужно использовать индексы, но я застрял!

т.е. я хочу вернуться (2, 7, 3) в этом случае

ответ

1

Что будет делать:

[max(u for u,v in zip(x,y) if v=='b') for x,y in lsts if 'b' in y] 

Использование zip() и max() во вложенном списке понимание

+0

Это не выполняется, если второй список не содержит a 'b'. например: 'lsts = ([[1,2,3], ['a', 'c', 'e']])' –

+0

@CraigBurgler Я отредактировал ответ и исправил эту проблему –

1

Одно из возможных решений к вашей проблеме:

lsts = ([[1, 2, 3], ['a', 'b', 'a']], 
     [[4, 5, 6, 7], ['a', 'a', 'b', 'b']], 
     [[1, 2, 3], ['b', 'a', 'b']], 
     [[1, 2, 3], ['a']] 
     ) 

result = [] 
for l in lsts: 
    indices = [l[0][index] for index, v in enumerate(l[1]) if v == 'b'] 
    if indices: 
     result.append(max(indices)) 

print result 
+0

, если второй список не содержит a 'b', код пытается добавить 'max ([])', который генерирует синтаксическую ошибку –

+0

@CraigBurgler Nice catch! Я отредактировал код, чтобы он работал в этом случае;) – BPL

0
def get_max(l): 
    first = True 
    for e1, e2 in zip(l[0], l[1]): 
     if e2 == 'b' and first: 
      max = e1 
      first = False 
     elif e2 == 'b' and e1 > max: 
      max = e1 
    return max 

result =() 
for l in lsts: 
    if 'b' in l[1]: 
     result += (get_max(l),) 
print(result) 
1

Следующая функция возвращает список result. Если необходимо, вы можете вернуть кортеж вместо списка.

def maxNum(lsts, character): 
    result = [] 
    for entry in lsts: 
     if character in entry[1]: 
      result.append(max(entry[0])) 
    return result 

# lsts = ... # (put lsts here) 

print maxNum(lsts, 'b') 
+0

Это возвращает [3,7,3] для примера OP. –

0

Это должно быть гораздо более эффективным, чем существующие решения, если подсписков есть много элементов, так как векторные над этими подсписками:

import numpy_indexed as npi 
results = [npi.group_by(k).max(v) for v,k in lsts] 
Смежные вопросы