我正在尝试创建一个方法(求和),它采用可变数量的向量并将它们相加。出于教育目的,我编写了自己的 Vector
类,并存储了底层数据在名为数据的实例变量中。
我的 @classmethod
求和代码有效(对于传入的每个向量,遍历数据变量中的每个元素并将其添加到结果列表中),但它似乎不是 Pythonic ,想知道是否有更好的方法?
class Vector(object):
def __init__(self, data):
self.data = data
@classmethod
def sum(cls, *args):
result = [0 for _ in range(len(args[0].data))]
for v in args:
if len(v.data) != len(result): raise
for i, element in enumerate(v.data):
result[i] += element
return cls(result)
最佳答案
itertools.izip_longest
在您的情况下可能会非常方便:
a = [1, 2, 3, 4]
b = [1, 2, 3, 4, 5, 6]
c = [1, 2]
lists = (a, b, c)
result = [sum(el) for el in itertools.izip_longest(*lists, fillvalue=0)]
在这里你得到了你想要的:
>>> result
[3, 6, 6, 8, 5, 6]
它所做的只是通过用 0
填充空值来将您的列表压缩在一起。例如izip_longest(a, b)
将是 [(1, 1), (2, 2), (3, 0), (4, 0)]
。然后将中间列表的每个元组元素中的所有值相加。
所以这里你一步一步来:
>>> lists
([1, 2, 3, 4], [1, 2, 3, 4, 5, 6], [1, 2])
>>> list(itertools.izip_longest(*lists, fillvalue=0))
[(1, 1, 1), (2, 2, 2), (3, 3, 0), (4, 4, 0), (0, 5, 0), (0, 6, 0)]
因此,如果您运行列表理解,将所有子元素相加,您就会得到结果。
关于添加向量列表的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32425391/