2013-04-23 4 views
4

MxN 매트릭스에서 매우 간단한 작업을 수행하려고합니다. 행렬에있는 요소 중 하나에 0이 들어 있으면 해당 요소가있는 전체 행을 제로화하고 싶습니다. 내 훈련받지 않은 마음이 고안 할 수있는 아마도 가장 강력하고 가장 무난한 해결책을 구현했습니다.이 코드를 어떻게 파이썬으로 만들 수 있습니까?

def has_zero(row): 
    for i in row: 
     if not i: 
      return True 
    return False 

def make_row_of_zeros(numColumns): 
    row = [] 
    for i in range(numColumns): 
     row.append(0) 
    return row 

def zeroify_if_has_zero(matrix): 
    columns = len(matrix[0]) 
    for i in range(len(matrix)): #making all you experts cringe! Sorry! 
     if has_zero(matrix[i]): 
      matrix[i] = make_row_of_zeros(columns) 
    return matrix 
+4

numpy 배열/행렬을 사용하고 있습니까? (그렇지 않다면 반드시해야합니다) – eudoxos

+4

http://codereview.stackexchange.com/에 게시해야합니다. – JeromeJ

+0

@JeromeJ 다시 게시 할 수있는 방법이 있습니까? 그것이 오류보다 스타일에 관한 질문이라는 사실이 codereview에 적합합니까? – Thalatta

답변

9

귀도가 파이썬 돌연변이과를 반환 생각하지 않습니다 내가 거기 지능형리스트와 사용 방법이 될 또는 (지도 호출)하지만 난 다음 내 짐승 시도 청소기보다 아무것도 생각할 수 있어야합니다 알고 돌연변이 값이므로 두 가지 선택 사항이 있습니다.

def zeroify_if_has_zero(matrix): 
    return [[0]*len(row) if 0 in row else row for row in matrix] 

돌연변이 (올바른 위치) 버전의 새로운 행렬 연산자를 * 함께

def zeroify_if_has_zero(matrix): 
    matrix[:] = [[0]*len(row) if 0 in row else row for row in matrix] 
+0

그게 내가 말하는거야! 감사합니다. – Thalatta

+2

원본을 수정하는 대신 새로 구성된 매트릭스를 반환합니다. 이것은 당신이 의도 한 것일 수도 아닐 수도 있습니다. – blubb

+2

@blubb, _and_ mutate를 반환하는 것은 pythonic이 아닙니다. 당신은 하나 또는 다른 것을해야합니다 –

1

사용 지능형리스트를 반환

. 예를 들면.

def make_row_of_zeros(numColumns): 
    return [0] * numColumns 
2

두 가지 첫 번째 기능에 대한 파이썬 내장 기능이 지원됩니다. 당신은 사람들을 위해 당신에게 간단 래퍼를 다시 작성하거나 배짱이 인라인 수 : 원하는 경우 목록의 이해와

def has_zero(row): 
    return not all(row) # this works because 0 is falsey 

def make_row_of_zeros(numColumns) 
    return [0] * numColumns 

당신은 마지막으로 (그리고 모든 것이 인라인을) 할 수 있습니다 :

def zeroify_if_has_zero(matrix): 
    return [row if all(row) else [0] * len(row) for row in matrix] 
1

또 다른를

def make_row_of_zeros(numColumns): 
    return list(itertools.repeat(0, numColumns)) 

그러나 실제로 그 기능이 필요합니까? 나의 관점에서 볼 때, 나의 제안과 sureshw의 제안 모두 실제로 필요하지는 않습니다. 그들은 스스로 설명 할 수 있습니다.

0

다른 모든 단서 이외에도 코드를 사용하는 경우 range에서 결과 목록을 필요로하지 않는 한 대신 xrange을 사용하십시오.