有人能帮我吗?我在想办法计算

>>> sum_widths = sum(col.width for col in cols if not col.hide)

还可以计算这个总数中的项目数,而不必在cols个项目上进行两次传递.

这似乎令人难以置信,但在扫描std库(内置函数、itertools、functools等)之后,我甚至找不到一个可以计算iterable中成员数的函数.我找到了函数itertools.count,听起来像是我想要的,但实际上它只是一个貌似命名为range的函数.

经过一番思考,我得出了以下结论(非常简单,没有库函数是可以原谅的,除了它的迟钝):

>>> visable_col_count = sum(col is col for col in cols if not col.hide)

然而,使用这两个函数需要两次iterable,这让我感到不舒服.

作为替代方案,以下函数满足我的要求:

>>> def count_and_sum(iter):
>>>     count = sum = 0
>>>     for item in iter:
>>>         count += 1
>>>         sum += item
>>>     return count, sum

问题是,它需要的时间是生成器表达式形式总和的timeit倍(根据timeit).

如果有人能想出一个简单的单行程序来满足我的需求,请告诉我(使用Python 3.3).

Edit 1

这里有很多好主意,伙计们.感谢所有回复的人.我需要一段时间来消化所有这些答案,但我会,我会试着挑一个来判断.

Edit 2

我重复了我的两个简单建议(count_and_sum个函数和两个单独的sum个函数)的计时,发现我原来的计时太晚了,可能是因为在后台运行了一个自动定时备份过程.

我还 Select 了这里给出的大多数优秀建议作为答案,所有建议都采用相同的模型.分析这些答案对我来说是一个很好的教育:dequeenumeratereduce的新用途,countaccumulate的首次使用.谢谢大家!

以下是使用我正在开发的显示软件的结果(来self 的慢速上网本):

┌───────────────────────────────────────────────────────┐
│                 Count and Sum Timing                  │
├──────────────────────────┬───────────┬────────────────┤
│          Method          │Time (usec)│Time (% of base)│
├──────────────────────────┼───────────┼────────────────┤
│count_and_sum (base)      │        7.2│            100%│
│Two sums                  │        7.5│            104%│
│deque enumerate accumulate│        7.3│            101%│
│max enumerate accumulate  │        7.3│            101%│
│reduce                    │        7.4│            103%│
│count sum                 │        7.3│            101%│
└──────────────────────────┴───────────┴────────────────┘

(我没有认为复杂和折叠的方法太晦涩难懂,但还是要谢谢你.)

由于所有这些方法在时间上几乎没有差别,我决定使用count_and_sum函数(带有一个显式for循环)作为最可读、显式和简单的(Python Zen),而且它碰巧也是最快的!

我希望我能接受这些令人惊叹的答案中的一个是正确的,但它们都同样好,尽管或多或少有些模糊,所以我只是投票给每个人,并接受我自己的答案是正确的(count_and_sum函数),因为这就是我正在使用的.

"应该有一种——最好只有一种——显而易见的方法来做到这一点."这是怎么回事?

推荐答案

感谢所有的好答案,但我决定使用我最初的count_and_sum函数,名为:

>>> cc, cs = count_and_sum(c.width for c in cols if not c.hide) 

正如在我最初问题的编辑中所解释的,这是最快、最具可读性的解决方案.

Python-3.x相关问答推荐

是否有必要使用Threads()中的args显式地将共享变量传递给Python中的线程函数或直接访问它?

S的两极是什么,相当于大Pandas 的`.ilo‘方法?

具有多个值的极轴旋转和熔化/取消旋转(反转旋转)操作(Pandas 堆叠/取消堆叠交替/UDF覆盖)

pandas查找另一列中是否存在ID

如何使用正则表达式通过反向搜索从链接中获取特定文本

DataFrame列中如何迭代重复值?

通过 Pandas 通过用户定义函数重命名数据框列

python3,将整数转换为字节:对于小整数使用 to_bytes() 有哪些替代方法?

隐藏Cartopy中高纬度非矩形投影的右侧轴(纬度)标签

DynamoDB - boto3 - batch_write_item:提供的关键元素与架构不匹配

Python Regex 查找给定字符串是否遵循交替元音、辅音或辅音、元音的连续模式

根据另一列值对多个数据框列进行分组

聚合(aggregate)为最多包含两个元素的列表

错误:预期语句,发现 py:Dedent

发送Electron邮件时的 MIMEText UTF-8 编码问题

ValueError:预期的 2D 数组,得到 1D 数组:

登录csv文件的正确方法是什么?

哪个更有效:Python 文档字符串还是类型提示?

如何使用异步 for 循环遍历列表?

如何将python日志(log)级别名称转换为整数代码