<p>您可以使用<code>operator.attrgetter</code>来获取对象的多个属性,然后使用<code>itertools.zip_longest</code>(python2.X中的<code>itertools.izip_longest</code>)将相关属性附加在一起。在</p>
<pre><code>from operator import attrgetter
all_result = [attrgetter('usedBytes','total','aligned','encoding')(obj) for obj in keys.items()]
</code></pre>
<p>或者使用生成器表达式来创建生成器而不是列表:</p>
^{pr2}$
<p>然后使用<code>zip_longest</code>:</p>
<pre><code>used_bytes, total_bytes, aligned_bytes, encodings = zip_longest(*all_results)
</code></pre>
<p>然后使用<code>map</code>函数对需要求和的iterables应用<code>sum</code>函数:</p>
<pre><code>used_user, used_real, aligned = map(sum,(used_bytes, total_bytes, aligned_bytes))
</code></pre>
<p>分别为<code>len</code>和{<cd8>}:</p>
<pre><code>total_elements = len(used_bytes)
mean = statistics.mean(used_bytes)
</code></pre>
<p>如果您想将所有子列表作为生成器处理(在内存使用方面更优化,而在运行时方面性能更低),则可以使用新类,以便使用生成器分别计算所需结果:</p>
<pre><code>from itertools import tee
class Aggregator:
def __init__(self, all_obj):
self.obj = all_obj
self.used_user, self.mean = self.getTotalBytesAndMean()
self.total_elements = len(self.all_obj)
self.aligned = self.getAligned()
def getTotalBytesAndMean(self):
iter_1, iter_2 = tee((obj.usedBytes for obj in self.all_obj))
return sum(iter_1), statistics.mean(iter_2)
def getTotal(self):
return sum(obj.total for obj in self.all_obj)
def getAligned(self):
return sum(obj.aligned for obj in self.all_obj)
def getEncoding(self):
return (obj.encoding for obj in self.all_obj)
</code></pre>
<p>然后您可以:</p>
<pre><code>Agg = Aggregator(keys.items())
# And simply access to attributes
Agg.used_user
</code></pre>