Pythonic方式添加向量列表

Dan*_*ang 4 python list

我正在尝试创建一个方法(sum),它采用可变数量的向量并将它们添加进去.出于教育目的,我编写了自己的Vector类,并且底层数据存储在名为data的实例变量中.

我的代码@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)
Run Code Online (Sandbox Code Playgroud)

bag*_*rat 6

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)]
Run Code Online (Sandbox Code Playgroud)

在这里你得到了你想要的东西:

>>> result
[3, 6, 6, 8, 5, 6]
Run Code Online (Sandbox Code Playgroud)

它的作用是简单地将你的列表拉到一起,通过填充空值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)]
Run Code Online (Sandbox Code Playgroud)

因此,如果您运行列表推导,总结所有子元素,您将获得结果.


tob*_*s_k 5

你可以做的另一件事(这可能是更"Python化")将实现__add__魔术方法,所以你可以使用+sum在载体直接.

class Vector(object):
    def __init__(self, data):
        self.data = data

    def __add__(self, other):
        if isinstance(other, Vector):
            return Vector([s + o for s, o in zip(self.data, other.data)])
        if isinstance(other, int):
            return Vector([s + other for s in self.data])
        raise TypeError("can not add %s to vector" % other)

    def __radd__(self, other):
        return self.__add__(other)

    def __repr__(self):
        return "Vector(%r)" % self.data
Run Code Online (Sandbox Code Playgroud)

在这里,我还实现了在每个Vector的数据元素上添加Vectorint添加数字,以及"反向添加" __radd__,以使其sum正常工作.

例:

>>> v1 = Vector([1,2,3])
>>> v2 = Vector([4,5,6])
>>> v3 = Vector([7,8,9])
>>> v1 + v2 + v3
Vector([12, 15, 18])
>>> sum([v1,v2,v3])
Vector([12, 15, 18])
Run Code Online (Sandbox Code Playgroud)