我知道标题有点难以理解。抱歉,让我解释一下。例如:我们有一个嵌套列表,其中包含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和时间才能完成,我知道,但是我想不到的任何东西都比这更好。我知道必须有一种优雅有效的方法来解决此问题,请帮助我,非常感谢!
答案 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)]