添加向量列表的 Pythonic 方法

标签 python list

我正在尝试创建一个方法(求和),它采用可变数量的向量并将它们相加。出于教育目的,我编写了自己的 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/

相关文章:

python - 通过子进程杀死 FFMPEG 命令

python - 计算嵌套列表中的元素出现次数

r - 如何通过R中的字典映射列

python - 提取列表中嵌入的字典项

python - 如何强制 Django 模型中的 2 个字段共享相同的默认值?

python - Python中的正则表达式在 ":"之后获取文本

python - 系统打开文件限制导致 Locust 错误

python - 在Python中更改.bmp文件的图像分辨率

c++ - 在列表中查找特定项目

c# - 从列表中选择在成员函数上返回 true 的所有对象作为列表?