2017-03-02 1 views
-3

이 코드가 과도하다고 생각합니다. 어떻게 더 짧을 수 있습니까? 나는 초심자이기 때문에 나와 함께 곰.이 코드를 더 효율적으로 작성하려면 어떻게해야합니까?

The problem statement is this (from Automate the Boring stuff)

그리고 내 코드 : 일반적으로

#printtable() function - will take string list and display in rjustified table 

tabledata = [['apples', 'oranges', 'cherries', 'banana'], 
      ['Alice', 'Bob', 'Carol', 'David'], 
      ['dogs', 'cats', 'moose', 'goose']] 
def printtable(): 
    colwidths = [0] * len(tabledata) 
    strlen = 0 

#find parameter for rjust 

    for i in range(len(tabledata)): 
     for k in range(len(tabledata[i])): 
      wordlength = (len(tabledata[i][k])) 
      if wordlength > strlen: 
       colwidths[i] = wordlength 
      strlen = wordlength 
    maxword = max(colwidths) 

#print as table : 'invert' 
    x=0 
    while x<int(len(tabledata[0])): 
     for i in range(len(tabledata)): 
      print(tabledata[i][x].rjust(maxword, ' '), end=''), 
     x+=1 
     print('\n') 

printtable() 

, 어떻게 더 효율적으로 코딩을 배우고 시작할 수 있나요? 나는 flowcharting을 미리 시작할 수 있다고 생각하고 있었다. 보통은 필자가 쓰기 시작하고 그 자리에서 물건을 바꾼다. 내 모든 코드가 못생긴 것 같아서 어떤 조언도 부탁드립니다. 감사!

+6

http://codereview.stackexchange.com/ –

답변

0
import six 

tabledata = [['apples', 'oranges', 'cherries', 'banana'], 
      ['Alice', 'Bob', 'Carol', 'David'], 
      ['dogs', 'cats', 'moose', 'goose']] 
def printtable(): 
    widths = [] 

    for row in tabledata: 
     widths.append(max(*map(len,row))) 

    inverted = map(list, six.moves.zip_longest(*tabledata, fillvalue=' ')) 

    for row in inverted: 
     for j,word in enumerate(row): 
      w = widths[j] 
      l = len(word) 
      print ' '*(w-l)+word+' ', 
     print 

그냥 반전 부분을 줄입니다. 또한 인쇄 ''* (w-l)는 오른쪽 공백을 나타냅니다. 여기도 재미있게하기 위해 중심 정렬을 시도 할 수 있습니다.

또한 질문에 대답하기 위해서는 많은 연습을해야하며 목록과 같은 모든 파이썬 데이터 구조를 이해해야합니다. 특히 목록 작성,지도, 람다, 연산자 등등. 필자는 대답을 많이 사용했다는 것을 알 수 있습니다. 가능한 한 '파이썬'으로 코드를 작성해보십시오. -P

i in range() 인 경우 반복 목록은 항상 for a in arr: 또는 for i,a in enumerate(arr)을 사용합니다. 훨씬 좋아 보입니다.

+0

왜 -1일까요? 내 코드도 잘 작동합니다 .. –