-3

我觉得这段代码太过分了——怎么能更短?我是初学者,所以请耐心等待。

问题陈述是这样的(来自自动化无聊的东西)

我的代码:

#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()

一般来说,我怎样才能开始更有效地学习编码?我在想我可以提前开始绘制流程图——因为通常我只是开始写作并当场改变东西。我觉得我所有的代码都很丑陋,所以任何提示都值得赞赏。谢谢!

4

1 回答 1

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

只是减少了反相部分。打印 ' '*(wl) 也用于右侧的空格。您也可以在这里尝试做一些中心对齐,只是为了好玩。

另外要回答您的问题,您需要大量练习并理解所有 python 的数据结构,例如列表,尤其是列表推导、映射、lambdas、* 运算符等。您可以看到我在回答中大量使用了它们,并且总是尝试使您的代码尽可能“pythonic”:-P

此外,在迭代列表时,始终使用for a in arr:orfor i,a in enumerate(arr)代替 if i in range()。它看起来好多了

于 2017-03-02T07:13:08.410 回答