【问题标题】:Adding Columns in 2D array (Python)在二维数组中添加列(Python)
【发布时间】:2014-06-24 03:06:03
【问题描述】:

所以我试图添加一个二维数组的所有列,除了数组的前两列。如果该行的总和大于或等于 9 且小于 12,我希望该函数打印该行。这是我的二维数组的一个示例,它是一个列表:

[[12606.000,  74204.000,     1.000,     1.000,     1.000,     1.000,     1.000,     0.000,     0.000],        
[12606.000,  105492.000,     0.000,     0.000,     0.000,     0.000,     0.000,     0.000,     1.000],    
[12606.000,  112151.000,     1.000,     1.000,     0.000,     0.000,     0.000,     0.000,     0.000],     
[12606.000,  121896.000,     0.000,     0.000,     0.000,     0.000,     0.000,     1.000,     0.000]]     

(为了格式化删除了一些列)。 这是我的代码:

def sumBinRow(A):
    """Returns the list of employees recording data for at least nine months and fewer than twelve.
    """
    for i in range(len(A)):
        for j in range(len(A[i])):
            if 9 <= sum(A[i][j+2]) <12:
                print A[i]

我不断收到“类型错误”,说“int”对象不可迭代。

【问题讨论】:

  • 有点。这是我的实习项目
  • 我在尝试时遇到同样的错误:“for j in range(12)”以及
  • 抱歉...发错帖
  • 所以你调用你的函数,参数是上面的列表列表?
  • 是 A 是作为函数输入的列表列表

标签: python arrays list


【解决方案1】:

基本上,您需要遍历每个列表,对于每个列表,从 2 开始取出该列表的一部分,然后将其相加并进行比较。

def sumBinRow(A):
    """Prints the list of employees recording data for at least nine months and fewer than twelve.
    """
    for row in A:
        if 9 <= sum(row[2:]) < 12:
            print row

或在 1 行原因为什么不:P

def sumBinRow(A):
    """Prints the list of employees recording data for at least nine months and fewer than twelve.
    """
    print [row for row in A if 9 <= sum(row[2:]) < 12]

【讨论】:

  • 打算提出同样的建议。虽然我会将名称和文档字符串调整为函数实际执行的操作...
【解决方案2】:

你应该这样总结。

def sumBinRow(A):
    """Returns the list of employees recording data for at least nine months and fewer than twelve.
    """
    for i in range(len(A)):
        sigma = 0
        for j in range(2,len(A[i])):
            sigma += A[i][j]
            if 9 <= sigma <12:
                print A[i]

【讨论】:

  • 我了解您的解决方案并且非常喜欢它,但由于某种原因,该函数返回的行都为 1
  • [12227.0, 38606.0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] [12227.0, 38606.0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] [12227.0, 67307.0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] [12227.0, 67307.0, 1、1、1、1、1、1、1、1、1、1、1、1]
【解决方案3】:

如果你使用NumPy 来完成这项任务,它会更简单、更快:

import numpy as np

a = np.array([[12606.000,  74204.000,     1.000,     1.000,     1.000,     1.000,     1.000,     0.000,     0.000],
              [12606.000,  105492.000,     0.000,     0.000,     0.000,     0.000,     0.000,     0.000,     1.000],
              [12606.000,  112151.000,     1.000,     1.000,     0.000,     0.000,     0.000,     0.000,     0.000],
              [12606.000,  121896.000,     0.000,     0.000,     0.000,     0.000,     0.000,     1.000,     0.000]])

b = a[:, 2:].sum(axis=1)
check = (b >= 9) & (b < 12)
print(a[check])

【讨论】:

    【解决方案4】:

    问题是你试图对不是数组的东西求和:

    if 9 <= sum(A[i][j+2]) <12: // A[j][j+2] is not iterable, it is an int
    

    相反,您想使用slice 函数:

    if 9 <= sum(A[i][2:]) <12:  // This will sum sum all but first two elements
    

    更 Pythonic 的方式是使用 list comprehension。这可以通过一行代码完成:

    A = [[12606, 74204 , 1, 1, 1, 1, 1, 0, 0],        
         [12606, 105492, 0, 0, 0, 0, 0, 0, 1],    
         [12606, 112151, 1, 1, 0, 0, 0, 0, 0],     
         [12606, 121896, 0, 0, 0, 0, 0, 1, 0]]
    
    print [row for row in A if 9 <= sum(row[2:]) < 12]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 2019-04-22
      • 2019-04-22
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多