2017-12-15 7 views
0

私はこのコードに遭遇しましたが、私は1つの問題があります。私はそれを実行すると、週末の日曜日の後に空白を残します。 "Mo Tu We Th Fr Sa Su"、そこにある空白を取り除く手助けが必要です。私は.replaceと.splitを使ってみましたが、これまでのところ助けにはなりませんでした。ありがとうございました。リスト上の空白を取り除くPython

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) 
+1

文字列に対して "strip()"メソッドを使用すると、両端の空白が削除されます。 – tmwilson26

+0

最後の文字を削除するにはstr [0:-1]を使用してください – Setop

+0

リストにstrip()を使用することはできません。 str [0:-1]と同じです。 – Jaakkath

答えて

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モジュールを使用することができます:私が正しく理解していれば、あなたはあなたが行くように一度に1週間の日数を印刷している

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

質問者の元のコードは、 'start_pos'が何ヶ月も持ち越されたために働いていました。あなたのコードでは、行の日数を数え、 'start_pos'を適切に更新して次の月が正しく出力されるようにロジック(おそらく最後の' if row'ブロック)を追加する必要があります。 – Blckknght

+0

あなたは正しいです...私はまた、日を蓄積することができます。 –

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

あなたはループが同様に出た後、印刷を追加する必要があるかもしれません、私は」didnのあなたのコードの正確なセマンティクスを調べることはできますが、このようなものはうまくいくはずです。

1

あなたはそうのような.strip()または.rstrip()を使用することができます。また

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

、「最後のスペース」せずにラインを構築:

あなたは基本的に3文字で印刷するすべての曜日のフォーマットこれは長さが21の文字列になります。平日の省略形には2文字しかないので、<を左揃えにフォーマットすると、スペースができます。あなたは何が起こっているかを見るために、より長い略語を試してみることができます。たとえば、'Su'ではなく'Sun'です。 7(平日)* 2(平日あたりの文字数)+6( "夜"):

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

は、上記のアプローチは、直接的に20文字の文字列を生成します。

関連する問題