【问题标题】:sum function not working求和函数不起作用
【发布时间】:2013-11-24 04:49:54
【问题描述】:

我正在尝试编写一个对列表奇数列中的整数求和的程序

def sum_of_odd_cols(x):
    for j in range(len(x)):
        odds=[x[k][j] for k in range(len(x)) if j%2!=0]
    return sum(odds)

x=[[1,2,5],[3,4,6],[7,8,9]]
print(sum_of_odd_cols(x))

我从中得到的是“0”,为什么会这样?

还有一个问题

x=[[1,2,5],[3,4,6],[7,8,9]]
for j in range(len(x)):
    col=[column[j] for column in x]

这似乎也创建了列表 x 中的列的列表,但是我不明白这是如何工作的 'column' 是 python 中的内置函数吗?

【问题讨论】:

  • 示例输入和预期输出会很好。
  • 返回0的原因是因为你的odds数组是空的。
  • 在循环的每次迭代中重新分配 oddscol 并不能达到您想要的效果。
  • odds=[x[k][j] for k in range(len(x)) if j%2!=0] 位也有问题。我不认为那是你想要做的。
  • 至于第二件事,column 不是内置函数。它是列表推导的迭代变量;请参阅for column in x 部分。我建议您阅读 Python for 循环的工作原理。像您的第一个 sn-p 使用的 range-len 迭代几乎从来都不是一个好主意。

标签: python list sum list-comprehension


【解决方案1】:

怎么样:

def sum_of_odd_cols(x):
    oddsum = 0
    for j in range(len(x)):
        oddsum += sum([x[k][j] for k in range(len(x)) if j%2!=0])
    return oddsum

x=[[1,2,5],[3,4,6],[7,8,9]]
print(sum_of_odd_cols(x))

这可能不是最好的方法,但它会让您的代码正常工作。在循环的每次迭代中,odds 变量都被一个新列表覆盖,并且由于最后一列是空的(它的索引是偶数),总和始终为 0。

【讨论】:

    【解决方案2】:

    它返回0的原因是因为你的odds数组在for循环结束时是空的;因为在循环的每次迭代中,您都在重置 odds。如果您以“长”方式编写循环,它将返回正确的结果:

    odds = []
    for j in range(len(x)):
       for k in range(len(x)):
          if j % 2 != 0:
             odds.append(x[k][j])
    

    如果我添加一些打印语句,会发生这种情况:

    j is: 0
    k is: 0
    k is: 1
    k is: 2
    j is: 1
    k is: 0
    Adding: 2 to odds
    k is: 1
    Adding: 4 to odds
    k is: 2
    Adding: 8 to odds
    j is: 2
    k is: 0
    k is: 1
    k is: 2
    >>> odds
    [2, 4, 8]
    

    关于你问题的第二部分:

    还有一个问题

    x=[[1,2,5],[3,4,6],[7,8,9]] for j in range(len(x)): col=[column[j] for x 中的列]

    这似乎也创建了列表 x 中的列的列表,但是我 不明白这是如何工作的“列”是一个内置函数 蟒蛇?

    不,这是list comprehension,一种构造列表的简写方式。

    循环其实是:

    col = []
    for column in x:
       col.append(column[j])
    

    其中j 是一些其他变量(设置在理解之上)。

    【讨论】:

      【解决方案3】:

      如果您对 NumPy 感到满意:

      import numpy as np
      
      a = np.array([[1,2,3], [1,2,3]])
      
      b = np.sum(a[:,::2], axis=0)   # column 0, 2, ...
      # b = [2, 6]
      b = np.sum(a[:,::2])
      # b = 8
      
      c = np.sum(a[:,1::2], axis=0)  # column 1, 3, ...
      

      【讨论】:

        【解决方案4】:

        你可以的

        x = [[1,2,5],[3,4,6],[7,8,9]]    # Generate the list
        sum([sum(k[1::2]) for k in x])   # Sum the numbers in odd columns
        # 14
        

        如果您需要奇数列中所有数字的组合总和。

        【讨论】:

        • 这不是对偶数列(索引)而不是奇数列求和吗?
        • 喜欢周日早上的咖啡前时间。
        • IT 靠咖啡运行。毫无疑问。
        【解决方案5】:

        您的第一个问题已被多次回答。

        至于你的第二个问题,考虑解压缩你的嵌套列表(假设它不是衣衫褴褛的):

        >>> x=[[1,2,5],[3,4,6],[7,8,9]]
        >>> [x for x in zip(*x)]
        [(1, 3, 7), (2, 4, 8), (5, 6, 9)]
        

        这会给你一个包含列的列表。

        如果元组有问题并且您需要列表中的列表,请使用内置list

        >>> [list(x) for x in zip(*x)]
        [[1, 3, 7], [2, 4, 8], [5, 6, 9]]
        

        所以基本上你的两个问题归结为:

        def sum_of_odd_cols(x):
            return sum(sum(x[1::2]) for x in x)
        
        def rows_to_columns(x):
            return [list(x) for x in zip(*x)]
        

        【讨论】:

          猜你喜欢
          • 2016-08-03
          • 1970-01-01
          • 1970-01-01
          • 2021-07-05
          • 2013-05-03
          • 2023-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多