【发布时间】:2019-11-26 21:31:28
【问题描述】:
l = [1,1,3,3,4,1,1,1,1,1,1,1,1,7000]
elem = 1;
# Terse method to find count of elem
cnt_of_1 = len([i for i in l if i == elem])
# Verbose method to find count of elem
cnt = 0
for i in l:
if i == elem:
cnt += 1
在这两种方法之间哪个是更pythonic 代码 和为什么?我确实意识到,在简洁的方法中,python 将在内部创建一个新列表并遍历该列表以查找新列表的长度;因此将空间复杂度增加到O(n)。与更冗长的代码相反,它具有空间复杂度O(1),因为唯一需要的额外空间是整数 cnt 变量。
至于可读性,我更喜欢第一种方法,因为它是一条具有相对简单逻辑的单行代码,因此我可以跳过这行代码并继续关注更大的图景(可能是领域或算法相关的焦点)。
我想听听人们的想法。
【问题讨论】:
-
sum(1 for i in l if i == elem)?您无需构建列表。 -
它必须是这两种方法之一吗?因为
l.count(elem)可以正常工作 -
复杂度是一样的,但是常量更小,因为它是作为
list类型的一部分实现的,而不是在 Python 级别。 -
在快速测试中,
l.count(elem)比详细方法快大约 4 倍。