algorithm - 总结列表和列表列表的 Pythonic 方式

标签 algorithm python

我正在尝试找到一种在同一函数中对列表和列表列表求和的巧妙方法,到目前为止我已经得到:

import operator
"""
 Fails late for item = ['a', 'b']
"""   
def validate(item):
    try:
        return sum(item) == sum(range(1, 10))
    except TypeError:
        return sum(reduce(operator.add, item)) == sum(range(1, 10))

"""
 Not valid for item = [1,2,[3,4,5]]
"""
def validate2(item):
        if isinstance(item[0], int):
            return sum(item) == sum(range(1, 10))
        else:
            return sum(reduce(operator.add, item)) == sum(range(1, 10))


print validate([1, 2, 3, 4, 5, 6, 7, 8, 9])
print validate([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

print validate2([1, 2, 3, 4, 5, 6, 7, 8, 9])
print validate2([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

...但这些对我来说似乎都不正确(文档字符串中的原因)。我想知道的是,是否有更好的方法来汇总列表和列表的列表,而不需要我捕获异常或在函数决定要做什么之前实际分析列表。

显然,我仍然希望 ['a', 'b'] 无效。

最佳答案

也许您会发现先将列表展平更容易?

def flatten(xs):
     for x in xs:
        try:
            sub = iter(x)
        except TypeError:
            yield x
        else:
            for y in flatten(sub):
                yield y

有了上面的内容,你可以这样做:

In [4]: fs = flatten([1,2,[3,4,[5,6],7],8,[9,10]])

In [5]: list(fs)
Out[5]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

关于algorithm - 总结列表和列表列表的 Pythonic 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2106996/

相关文章:

python - 在 NumPy 中设置值链接两个切片

c++ - 我的骑士之旅算法可能在无限循环中运行

algorithm - 处理来自套接字的碎片化输入的一般方法

c++ - 简化三次贝塞尔路径?

python - 我可以获取 python 对象的所有方法吗?

python - __name__ 在 TypeVar, NewType 中的用途

algorithm - 迭代排序算法的运行时间分析

java - 给定一个排序整数数组,我如何找到是否存在一组总和为 K 的 3 个元素?

python - python 中重叠列表函数在 True 时返回 False

python - 如何以矢量化方式而不是使用循环来编写代码?