我经常发现自己做了效率低下的循环:
def __add__(self, other):
dimensions = []
for i in range(max(self.numberOfDimensions, other.numberOfDimensions)):
a = None
if i < self.numberOfDimensions:
a = self[i]
b = None
if i < other.numberOfDimensions:
b = other[i]
# Doesn't actually do the right thing here.
dimensions.append(sum(map(lambda x: ((x is None) and 1 or 2) - 1, (a, b))))
return self.__class__(dimensions)
计算很简单,它只是处理得到我的if语句类型。顺便说一下,这是元组的子类,其中add运算符添加类似索引的值,如(1, 2, 3) + (4, 5, 6, 7) == (5, 7, 9, 7)
。我认为filter()
可以帮助我解决这个问题,但我不确定如何实现它。
编辑:这是针对Python 3的。
答案 0 :(得分:6)
我不确定我是否完全得到它,但我认为stdlib是你的朋友:
from itertools import izip_longest
dimensions = []
for a, b in izip_longest(self, other, fillvalue=0):
dimensions.append(a + b)
我认为列表理解不会很干净。
答案 1 :(得分:2)
这是使用列表理解的简单方法,虽然它是相当丑陋的恕我直言。
dimensions = [
sum(map(lambda x: ((x is None) and 1 or 2) - 1, (
self[i] if i<self.numberOfDimensions else None,
other[i] if i<other.numberOfDimensions else None
)))
for i in range(max(self.numberOfDimensions, other.numberOfDimensions))
]
答案 2 :(得分:2)
最简洁的方法是
map(sum, itertools.izip_longest(self, other, fillvalue=0))
或
itertools.starmap(operator.add,
itertools.izip_longest(self, other, fillvalue=0))
这就是我猜你的原始代码应该做的事情。如果您使用的是Python 3,请将结果转换为元组或列表或任何您想要的结果。
答案 3 :(得分:1)
虽然未经测试,但这个怎么样:
dimensions = [sum(map(lambda x: ((x is None) and 1 or 2) - 1, (self[i] if i < self.numberOfDimensions else None, other[i] if i < other.numberOfDimensions else None))) for i in range(max(self.numberOfDimensions, other.numberOfDimensions))]
答案 4 :(得分:0)
我认为您需要的缺失部分是:
(a,b) = (self[i] if i < self.numberOfDimensions else None, other[i] if i < other.numberOfDimensions else None)
当然,我并不相信单个表达式会更具可读性。你可能最好先使用某种地图来生成(a,b)
。