【发布时间】:2021-07-08 17:36:06
【问题描述】:
我只是想知道是否有更好的方法来查找列表中的所有最大数字。
例如,我有一个字典列表。它有一个键(“信息”)和对应的字典值,如下所示。我想从该列表中找到最大数量s(“计数”)。一旦找到最大数量,就必须确定该元素的相应“代码”。
我可以按如下方式进行,但是对于一个非常大的列表,执行时间会很长。
codes = [{"code": 1, "info": {"status": "running", "count": 4}},
{"code": 2, "info": {"status": "running", "count": 1}},
{"code": 3, "info": {"status": "running", "count": 2}},
{"code": 4, "info": {"status": "running", "count": 4}},
{"code": 5, "info": {"status": "running", "count": 4}}
]
count_max = 0
filtered_codes = []
for i in range(len(codes)):
if codes[i]['info']['count'] == count_max:
filtered_codes.append(codes[i]['code'])
if codes[i]['info']['count'] > count_max:
filtered_codes.clear()
filtered_codes.append(codes[i]['code'])
count_max = codes[i]['info']['count']
print(filtered_codes)
输出: [1, 4, 5] #1,4,5 是字典的代码,count == 4(所有计数中的最大值)
那么,有没有更好的方法来做到这一点?可能正在使用过滤器,lambda,max?
编辑:有人发布了以下代码作为答案,后来被删除了
max_count = max(info["info"]["count"] for info in codes)
filtered_codes = [val["code"] for val in filter(lambda x: x["info"]["count"] == max_count, codes)]
所以我在长度 1000000
的列表上运行了两个代码我发布的第一个方法是:1.4539954662322998s
采取第二种方法:0.4440000057220459s
那么第二种方法是最好的解决方案吗?
【问题讨论】:
-
您的方法已经是
O(N)。如果使用filter()、lambdas 和max()执行此操作,性能不会有显着提高。为了使它更pythonic,您可以将for i in range(len(codes))更改为for i, elem in enumerate(codes),然后使用elem而不是codes[i],但是试图将所有内容都塞进一行会适得其反,因为它不会导致很大的加速但会产生巨大的影响代码的可读性。 -
@PranavHosangadi 我已经更新了这个问题,请您提供一些关于它的见解
标签: python-3.x