【问题标题】:Adding up number in a list with every 3 number将列表中的数字与每 3 个数字相加
【发布时间】:2012-07-29 02:56:14
【问题描述】:

我有一个像这样排成一行的数字列表:

0
1
0
2
0
4

它有大约数千行

我想每 3 行将它们加起来,结果会是这样的:

1
6

我已经用这一行将列表变成了单独的整数:

k = map(lambda s: s.strip(), k)
integer = map(int, k)

我怎样才能做加法?

【问题讨论】:

  • 当你说你有一个数字列表时,你是指一个文件、字符串还是一个实际的列表?
  • @jamylak 我把它放在一个 .txt 文件中,但我必须编写用于打开文件、读取文件和上面的代码将它们转换为整数的代码

标签: python python-2.7


【解决方案1】:

这可能是最蟒蛇的:

>>> my_list = iter(my_list)
>>> map(sum, zip(my_list, my_list, my_list))
[1, 6]

【讨论】:

    【解决方案2】:

    这将跳过不适合三个一组的剩余数字:

    >>> def sum_three(iterable_):
    ...     iterable_ = iter(iterable_)
    ...     while True:
    ...         yield next(iterable_) + next(iterable_) + next(iterable_)
    ...
    >>> my_list = [0, 1, 0, 2, 0, 4, 99, 1]
    >>> list(sum_three(my_list))
    >>> [1, 6]
    

    【讨论】:

      【解决方案3】:

      使用石斑鱼,例如来自Alternative way to split a list into groups of n

      import itertools
      
      def grouper(n, iterable, fillvalue=None):
          "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
          args = [iter(iterable)] * n
          return itertools.izip_longest(*args, fillvalue=fillvalue)
      
      map(sum, grouper(3, interger, 0))
      

      请注意,上面的代码假定python 2.x;对于 3.x,您需要改用 itertools.zip_longest

      演示:

      >>> example = [0, 1, 0, 2, 0, 4]
      >>> map(sum, grouper(3, example, 0))
      [1, 6]
      

      【讨论】:

        【解决方案4】:

        既然你说你已经有了一个数字列表,那么

        result = [sum(data[i:i+3])for i in range(0, len(data),3)]
        

        例如,

         data = range(1, 16) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
        

        产量

         [6, 15, 24, 33, 42]
        

        【讨论】:

        • @Downvoter 乐于纠正错误或改进答案,但没有解释的否决票没有建设性,对 OP、SO 或我来说毫无价值。
        【解决方案5】:

        Grouper 和所有花哨的东西都可以工作……但在这种情况下,简单的列表理解就可以了。它应该又好又快! :)

        >>> q = range(9)
        >>> q
        [0, 1, 2, 3, 4, 5, 6, 7, 8]
        >>> [sum(q[3*n:3*n+3]) for n in range(len(q)/3)]
        [3, 12, 21]
        

        【讨论】:

          【解决方案6】:

          使用itertools grouper 配方

          >>> from itertools import izip_longest
          >>> def grouper(n, iterable, fillvalue=None):
                  "Collect data into fixed-length chunks or blocks"
                  # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
                  args = [iter(iterable)] * n
                  return izip_longest(fillvalue=fillvalue, *args)
          
          >>> with open('data.txt') as fin:
                  for g in grouper(3, fin):
                      print sum(map(int, g))
          
          
          1
          6
          

          【讨论】:

            猜你喜欢
            • 2021-09-24
            • 1970-01-01
            • 2011-08-10
            • 1970-01-01
            • 2019-03-13
            • 2012-09-19
            • 2012-06-15
            • 2018-05-09
            • 1970-01-01
            相关资源
            最近更新 更多