питон. подсчет во вложенном списке максимум 3-го элемента каждого элемента в соответствии со вторым элементом - PullRequest
3 голосов
/ 28 октября 2019

Я знаю, что название немного сложно понять. Извините за это, позвольте мне объяснить. Например: у нас есть вложенный список, состоящий из 4 списков, каждый из которых состоит из 3 элементов, первые два являются строками ( не символ ), а третий - целым:

LLList = [ ["A", "B", 30], ["C", "B", 30], ["D", "B", 20], ["D", "L", 60] ]

Iхотите посчитать число или вернуть все индексы элементов в «LLList» (элементы в «LLList» - это списки из трех элементов, такие как [«A», «B», 30]), где третий элемент является наибольшим, гдеВторой элемент - «B».

Наивным способом было бы найти все элементы, чьи вторые элементы - «B», и поместить их в список. в этом случае будет:

TempList = []

for w in LLList
    if w[1] == "B"
    TempList.append(w)

Результат будет:

TempList = [ ["A", "B", 30], ["C", "B", 30], ["D", "B", 20] ]

Тогда найти максимальное значение среди 3-х элементов в TempList в этом случае будет 30

MaxB = max(TempList, key = lambda x:x[2])[2] # MaxB = 30

И посчитать вхождение MaxB в 3-й столбец TempList

[p[2] for p in TempList].count(MaxB)

В этом случае будет 2

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

Ответы [ 3 ]

1 голос
/ 28 октября 2019

Простой способ использования numpy.amax и понимания списка.

Это найдет ваши значения:

import numpy as np    
maxB = [x for x in LLList if x[1]=='B' and x[2] == np.amax([x[2] for x in LLList if x[1]=='B'])]

Он найдет все значения, которые имеют B в x [1], а x [2] равно максимуму значений сБ.

После этого вам просто нужно найти индексы:

[LLList.index(x) for x in maxB]
1 голос
/ 28 октября 2019

Вы также можете использовать collections.Counter:

from collections import Counter

LLList = [ ["A", "B", 30], ["C", "B", 30], ["D", "B", 20], ["D", "L", 60] ]

a = Counter([i[2] for i in LLList if i[1]=="B"])

print (a.most_common(2))

#[(30, 2), (20, 1)]

print (sorted(a.items(),key=lambda x: x[0],reverse=True)) #or get highest value

#[(30, 2), (20, 1)]
1 голос
/ 28 октября 2019
dict_ans = {}
for sub in LLList:
    if sub[1] == 'B':
        dict_ans[sub[2]] = dict_ans.get(sub[2], 0) + 1

print (dict_ans)
#{30: 2, 20: 1}

print (max(value for key, value in dict_ans.items())
#2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...