3

我知道标题有点难以理解。对不起,让我解释一下。例如:我们有一个嵌套列表,由 4 个列表组成,每个列表有 3 个元素,前两个是字符串(不是 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 中第三个元素中的最大值,在这种情况下将是 30

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

并统计在 TempList 的第 3 列出现 MaxB

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

在这种情况下将是 2

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

4

3 回答 3

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
于 2019-10-28T07:21:23.443 回答
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)]
于 2019-10-28T07:43:09.037 回答
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]
于 2019-10-28T07:34:02.397 回答