【问题标题】:Which is better form of python code here and Why? [duplicate]这里哪个是更好的python代码形式,为什么? [复制]
【发布时间】: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 变量。

至于可读性,我更喜欢第一种方法,因为它是一条具有相对简单逻辑的单行代码,因此我可以跳过这行代码并继续关注更大的图景(可能是领域或算法相关的焦点)。

我想听听人们的想法。

【问题讨论】:

标签: python list-comprehension


【解决方案1】:

在这种特殊情况下,最惯用的方法是使用:

l.count(elem)

不要滚动你自己版本的内置列表方法,改进它的希望很小。

一般来说,for 循环与列表推导式的区别在于个人喜好。当 O(1) 算法微不足道时,我讨厌使用 O(N) 算法,所以我永远不会使用 len([...])。您可以执行以下操作:

sum(1 for x in l if x == elem)

但就我个人而言,我觉得它的可读性略差。

我为简单的数据转换保留列表推导,即映射/过滤操作的某种组合。

【讨论】:

    【解决方案2】:

    更简洁:

    cnt_of_1 = sum(i == elem for i in l)
    

    之所以有效,是因为 True == 1False == 0

    【讨论】:

    • 我不喜欢这种方法,因为这似乎是一种 Python 特有的知识,不是每个人都能理解或知道的。
    • 我不喜欢这个,因为它重新实现了一个内置的list 方法。 boolint 的子类这一事实并不是一个特别晦涩的知识。
    • @chepner 老实说我不知道​​内置的 list 方法。 Python 足够大,它的一部分可以逃过你的注意。
    • 第二条评论在您发布此答案前 6 分钟指出了这一点。
    • @chepner 所以我花了 6 分钟才弄清楚如何准确地表达我的答案 - 我从未见过评论。我不认为这是一个巨大的失败。
    猜你喜欢
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2016-04-06
    相关资源
    最近更新 更多