Python如何统计列表中小于每个元素的元素个数
代码错误原因
你的代码存在两处核心逻辑问题,导致结果不符合预期:
count变量作用域错误:你将计数变量count定义在所有循环的外层,每次统计完一个元素的计数后没有重置,数值会持续累加,最终结果自然越来越大。- 循环和判断逻辑错误:
- 内层循环从
i+1位置开始遍历,仅统计了当前元素之后的元素,没有覆盖整个列表的所有元素 - 判断条件写反:你写的
lst[i] < lst[j]是在统计比当前元素大的元素数量,和你要的「统计小于当前元素的数量」需求完全相反
- 内层循环从
基础修正版本
把计数变量移到外层循环内部每次重置,内层遍历全列表做判断即可:
lst = [1,2,3,4,5,6,7] final = [] for current_num in lst: count = 0 # 每处理一个元素前先把计数清零 for check_num in lst: if check_num < current_num: count += 1 final.append(count) print(final)
运行后输出为[0, 1, 2, 3, 4, 5, 6],和预期结果一致。
效率优化版本
上面的双重循环时间复杂度为O(n²),当列表长度较大时运行效率低。如果列表元素无重复,可以用排序加索引的方式把时间复杂度降到O(n log n):
lst = [1,2,3,4,5,6,7] sorted_lst = sorted(lst) final = [sorted_lst.index(num) for num in lst] print(final)
如果列表存在重复元素,可以借助二分查找模块bisect实现,避免index方法返回错误的重复值索引:
import bisect lst = [1,2,2,3,4,5] sorted_lst = sorted(lst) final = [bisect.bisect_left(sorted_lst, num) for num in lst] print(final)
上述代码针对重复元素列表的输出为[0, 1, 1, 3, 4, 5],符合统计规则。
内容的提问来源于stack exchange,提问作者Vishwanath R Kulkarni
相关产品推荐
相关产品推荐

