所以,我遇到了这段代码,但我有一个问题。当我运行它时,它会在星期日之后留下一个空白。 " 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)
答案 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;)。