Python摆脱了列表上的空白

时间:2017-12-15 22:48:02

标签: python list whitespace

所以,我遇到了这段代码,但我有一个问题。当我运行它时,它会在星期日之后留下一个空白。 " Mo Tu We Th Fr Sa Su",我需要帮助摆脱那里的空白。我尝试过使用.replace和.split,但到目前为止他们还没有帮助。谢谢。

calendar1 = [('January', range(1, 31 + 1)),
            ('Feburary', range(1, 28 + 1)),
            ('March', range(1, 31 + 1)),
            ('April', range(1, 30 + 1)),
            ('May', range(1, 31 + 1)),
            ('June', range(1, 30 + 1)),
            ('July', range(1, 31 + 1)),
            ('August', range(1, 31 + 1)),
            ('September', range(1, 30 + 1)),
            ('October', range(1, 31 + 1)),
            ('November', range(1, 30 + 1)),
            ('December', range(1, 31 + 1))]

week = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']

def make_calendar(year, start_day):

    # Determine current starting position on calendar
    start_pos = week.index(start_day)

    for month, days in calendar1:
        # Print month title
        print('{0} {1}'.format(month, year).center(20, ' '))
        # Print Day headings
        print(''.join(['{0:<3}'.format(w) for w in week]))
        # Add spacing for non-zero starting position
        print('{0:<3}'.format('')*start_pos, end='')

        for day in days:
            # Print day
            print('{0:<3}'.format(day), end='')
            start_pos += 1
            if start_pos == 7:
                # If start_pos == 7 (Sunday) start new line
                print()
                start_pos = 0 # Reset counter
        print('\n')

yr=int(input('Enter Year'))
strtday=input('Enter start day of the year Mo,Tu,We,Th,Fr,Sa,Su')
make_calendar(yr,strtday)

3 个答案:

答案 0 :(得分:1)

要打印标题,我会使用join加入日期,使用空格作为分隔符:

        # Print Day headings
        print(' '.join(['{0:<2}'.format(w) for w in week]))

您的日历是一张桌子。要打印每周,您可以使用填充日期的行。一旦该行有7个日期,您可以打印它:

        row = ['  '] * start_pos
        for day in days:
            row.append('{0:>2}'.format(day))
            if len(row) == 7:
                print(' '.join(row))
                row = []
        if row:
            print(' '.join(row))
        print()

请注意,当您打印当月的日历时,必须考虑上个月的最后一天。有一个转变...所以,你的算法是错误的。 ; - )

修改

您可以使用calendar模块:

def format_day(day):
    return '{0:>2}'.format(day) if day else '  '

def print_calendar(year, month):
    c = calendar.Calendar()
    for week in c.monthdayscalendar(2018, 2):
        print(' '.join(map(format_day, week)))

print_calendar(2018, 2)

答案 1 :(得分:1)

如果我理解正确的话,你可以随时打印一周中的一天,你希望它们是2个字符加上一个空格来分隔它们,所以剥离个别日子可能会赢得&#39做你想做的事。您可以稍微更改代码以构建字符串,直到您构建整行,然后打印它,即类似:

s = ''
... 
# Print day
s += f'{day:<3}'  # Using the new format string feature in 3.6, otherwise use old style format
if start_pos == 7:
    print(s.rstrip())  # Eliminate trailing whitespace
...

你可能需要在循环退出后添加一个打印件,我没有检查你的代码的确切语义,但是这样的东西应该有效。

答案 2 :(得分:1)

您可以这样使用.strip().rstrip()

print(''.join(['{0:<3}'.format(w) for w in week]).strip())

或者,构造最后没有&#34;空格的行&#34;:

您基本上将所有工作日的格式设置为使用3个字符打印,这会产生一个长度为21的字符串。由于工作日的每个缩写中只有两个字母,您使用{{1}格式化左对齐,你得到一个空格。您可以尝试使用较长的缩写来查看正在发生的事情,例如<而不是'Sun'

'Su'

上述方法直接生成一个包含20个字符的字符串:7(工作日)* 2(每个工作日的字符数)+6(&#34;晚上&#34;)。