Python摆脱了列表上的空白

问题描述 投票:0回答:3

所以,我遇到了这个代码,但我有一个问题。当我运行它时,它会在星期日之后留下一个空白。 “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)
python list whitespace
3个回答
1
投票

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

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
...

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


1
投票

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

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

或者,构造没有“最后空间”的线:

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

print(' '.join(['{0:<2}'.format(w) for w in week]))
       ↑             ↑
   glue/night   length of the 
                formatted string

上述方法直接生成20个字符的字符串:7(工作日)* 2(每个工作日的字符数)+6(“夜晚”)。


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)
© www.soinside.com 2019 - 2024. All rights reserved.