簡體   English   中英

用Python方式匯總列表和列表列表

[英]Pythonic way of summing lists and lists of lists

我正在嘗試找到一種在同一函數中匯總列表和列表列表的巧妙方法,到目前為止,我已經:

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]

不要忘記准確描述您要做什么。 我假設您的意思是將所有值求和成一個值,而不是得到例如。 [[1,2],[3,4]]-> [3,7]。 這是簡單的遞歸; 如果您跳過測試,則需要五行代碼:

def sums(it):
    """
    >>> sums(1)
    1
    >>> sums([1,2,3])
    6
    >>> sums([1,2,3,[4,5]])
    15
    >>> sums(['a','b'])
    Traceback (most recent call last):
    ...
    TypeError: unsupported operand type(s) for +: 'int' and 'str'
    """
    if getattr(it, "__iter__", None):
        return sum(map(sums, it))
    else:
        return it

if __name__ == "__main__":
    import doctest
    doctest.testmod()

外部numpy模塊具有許多操作(包括sum() ),它們在標量,向量,矩陣甚至更高維數組上的工作方式相似。

但是請注意,它不適用於[1,2,[3,4,5]]這樣的混合列表,只能用於平方矩陣! 因此,它並不能完全回答您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM