修改2D数组(Python)

时间:2014-06-23 16:27:42

标签: python arrays python-2.7

嘿伙计们,所以我有一个看起来像这样的2D数组:

12381.000  63242.000     0.000     0.000     0.000     8.000     9.200     0.000     0.000     
12401.000  8884.000     0.000     0.000    96.000   128.000   114.400    61.600     0.000    
12606.000  74204.000    56.000    64.000    72.000    21.600    18.000     0.000     0.000     
12606.000  105492.000     0.000     0.000     0.000     0.000     0.000     0.000    45.600     
12606.000  112151.000     2.400     4.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    60.800     0.000     

(由于格式化而切断了几列)

因此,它表示员工ID,部门ID,然后是每个员工工作的12个月以及他们每个月工作的小时数。我的2D数组本质上是一个列表列表,其中每一行都是一个列表。我试图将每个非零值转换为一个并保持所有零。有857行和14列。我的代码如下:

def convBin(A):
    """Nonzero values are converted into 1s and zero values are kept constant.
    """
    for i in range(len(A)):
        for j in range(len(A[i])):
            if A[i][j] > 0:
                A[i][j] == 1
            else:
                A[i][j] == 0
    return A

有人能告诉我我做错了吗?

1 个答案:

答案 0 :(得分:3)

你正在循环中进行平等评估,而不是赋值

A[i][j] == 1

应该是

A[i][j] = 1
      # ^ note only one equals sign

此外,没有必要return A; A正在进行就地修改,因此通过删除显式return None行隐式return ...是常规的。

你应该记住:

  • 你实际上并不想在else案件中做任何事情;和
  • range(len(...))进行迭代不是Pythonic - 例如使用enumerate

因此,您的功能可以简化为:

def convBin(A):
    """Convert non-zero values in 2-D array A into 1s."""
    for row in A:
        for j, val in enumerate(row):
            if val:
                row[j] = 1