【问题标题】:Turn iterable of tuple into iterables of each element (Python)将元组的可迭代转换为每个元素的可迭代(Python)
【发布时间】:2018-07-13 21:00:15
【问题描述】:

我有一个可迭代的delta,它生成两个数字的元组(dx, dy),我想计算每个数字的总和。由于delta 在第一次迭代后被释放,因此以下内容不起作用。

x = sum(dx for dx, dy in delta)
y = sum(dy for dx, dy in delta)

有什么想法吗?我正在考虑以某种方式将delta 变成dxdy 的两个可迭代对象,但到目前为止还没有实现。

【问题讨论】:

  • This的问题和你的问题有关,也看看这个。

标签: python python-3.x iterable generator-expression


【解决方案1】:

应该这样做!

ysum = 0
xsum = 0

for dx, dy in delta:
    xsum += dx
    ysum += dy

生成器的想法是您可以将其耗尽一次,那么为什么不一次完成所有数学运算呢?

【讨论】:

    【解决方案2】:

    使用zip()map() 函数在每一列上应用sum()

    x, y = map(sum, zip(*delta))
    

    【讨论】:

    • 解决方案非常好。但是一个快速的问题:zip(*delta) 会完全消耗delta 并立即将整个内容加载到内存中吗?
    • @Lingxi 不是在 Python-3 中,而是在 Python-2 中 zip 返回一个列表。在 Python-2 中,您应该使用 itertools.izip()
    • 我认为zip() 不会立即使用它,但*delta 会。没有?
    • 把它扔出去(作为一个相当奇怪的选择......但似乎有效):sum((Counter({'a': a, 'b': b}) for a, b in d), Counter())
    • 当然a, b = reduce(lambda a, b: (a[0] + b[0], a[1] + b[1]), d) 使用直接迭代和存储而不是依赖解包,但几乎没有最大的可读性......
    猜你喜欢
    • 1970-01-01
    • 2018-08-19
    • 2021-11-14
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多