蟒蛇。根据第二个元素,在嵌套列表中计算每个元素的第三个元素的最大值

时间:2019-10-28 07:07:32

标签: python list

我知道标题有点难以理解。抱歉,让我解释一下。例如:我们有一个嵌套列表,其中包含4个列表,每个列表包含3个元素,前两个是字符串( not char ),第三个是int:

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

我想计算数量或返回“ 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] ]

然后在这种情况下,在TempList的第三个元素中找到最大值

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

并在TempList的第3列中计数MaxB的出现

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

在这种情况下为2

这是一个过于幼稚的方法,代码太多,需要太多RAM和时间才能完成,我知道,但是我想不到的任何东西都比这更好。我知道必须有一种优雅有效的方法来解决此问题,请帮助我,非常感谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

使用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'])]

它找到x [1]中所有具有B的值,并且x [2]等于B中所有值的最大值。

之后,您只需要找到索引:

[LLList.index(x) for x in maxB]

答案 2 :(得分:1)

您也可以使用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)]