有人能帮我吗?我在想办法计算
>>> 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 了这里给出的大多数优秀建议作为答案,所有建议都采用相同的模型.分析这些答案对我来说是一个很好的教育:deque
、enumerate
和reduce
的新用途,count
和accumulate
的首次使用.谢谢大家!
以下是使用我正在开发的显示软件的结果(来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
函数),因为这就是我正在使用的.
"应该有一种——最好只有一种——显而易见的方法来做到这一点."这是怎么回事?