12

私の仕事は、指定された weekday から始まる曜日のリストを返すweekdays(weekday)関数を定義することです。次のように動作するはずです。

>>> weekdays('Wednesday')
['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']

これまでのところ、私はこれを思いつきました:

def weekdays(weekday):
    days = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday',
            'Sunday')
    result = ""
    for day in days:
        if day == weekday:
            result += day
    return result

ただし、これは入力日のみを出力します。

>>> weekdays("Sunday")
'Sunday'

私は何を間違っていますか?

4

10 に答える 10

15

コードが 1 つの曜日名のみを返す理由は、 がタプルweekday内の複数の文字列と一致することがないdaysため、それに続く曜日が追加されないためです (また、その前の曜日に折り返されません)。たとえそれが何らかの形で行われたとしてもresult、空の ではなく空の文字列に初期化しているため、それらすべてを 1 つの長い文字列として返しますlist

datetimeモジュールを使用して、現在のロケールの言語で「月曜日」で始まるすべての曜日名のリストを作成するソリューションを次に示します。次に、このリストを使用して、返される目的の順序で名前の別のリストを作成します。元のリストで指定された日のインデックスを見つけ、そのインデックスに関連する 2 つのスライスをつなぎ合わせて結果を形成することにより、順序付けを行います。最適化として、ロケールの曜日名もキャッシュするため、同じ現在のロケールで再度呼び出された場合 (可能性の高いシナリオ)、このプライベート リストを再作成する必要はありません。

import datetime
import locale

def weekdays(weekday):
    current_locale = locale.getlocale()
    if current_locale not in weekdays._days_cache:
        # Add day names from a reference date, Monday 2001-Jan-1 to cache.
        weekdays._days_cache[current_locale] = [
            datetime.date(2001, 1, i).strftime('%A') for i in range(1, 8)]
    days = weekdays._days_cache[current_locale]
    index = days.index(weekday)
    return days[index:] + days[:index]

weekdays._days_cache = {}  # initialize cache

print(weekdays('Wednesday'))
# ['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']

関数内で曜日名をハードコードする必要がないことに加えて、モジュールを使用するもう 1 つの利点は、datetimeモジュールを使用するコードが他の言語で自動的に機能することです。これは、ロケールを変更し、対応する言語の曜日名で関数を呼び出すことで説明できます。

たとえば、フランスはデフォルトのロケールではありませんが、以下に示すように、テスト目的で現在のロケールに設定できます。注: この曜日名の大文字化の記事によると、デフォルトの英語ロケールのように曜日名はフランス語では大文字になりませんが、これも自動的に考慮されます。つまり、weekday名前が渡されます。現在のロケールの言語である必要があり、大文字と小文字も区別されます。もちろん、必要に応じて、入力引数の大文字と小文字を無視するように関数を変更することもできます。

# set or change locale
locale.setlocale(locale.LC_ALL, 'french_france')

print(weekdays('mercredi'))  # use French equivalent of 'Wednesday'
# ['mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche', 'lundi', 'mardi']
于 2010-11-03T01:09:29.330 に答える
10

はるかに迅速なアプローチは、平日のサイクルを覚えておくことです。そのため、リストを含めたい最初の日を取得し、残りの 6 つの要素を最後に追加するだけです。言い換えると、開始日から始まる平日のリストを取得し、別の 1 週間分を追加して、最初の 7 つの要素のみを返します (1 週間分)。

days = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
def weekdays ( weekday ):
    index = days.index( weekday )
    return list( days[index:] + days )[:7]

>>> weekdays( 'Wednesday' )
['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
于 2010-11-02T23:03:01.873 に答える
6
def weekdays(day):
    days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
    i=days.index(day) # get the index of the selected day
    d1=days[i:] #get the list from an including this index
    d1.extend(days[:i]) # append the list form the beginning to this index
    return d1

そして、それが機能することをテストしたい場合:

def test_weekdays():
    days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
    for day in days:
        print weekdays(day)
于 2010-11-02T23:22:50.133 に答える
4

うーん、現在、指定された曜日のみを検索して結果として設定しています:)これを行うには、pythonリストでスライス機能を使用できます。

result = days[days.index(weekday):] + days[:days.index(weekdays)]
于 2010-11-02T22:56:26.263 に答える
4

ここにあなたが望むものがもっとあります:

def weekdays(weekday):
    days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
    index = days.index(weekday)
    return (days + days)[index:index+7]
于 2010-11-02T22:57:26.930 に答える
2

あなたのresult変数は、オブジェクトではstringありません。また、渡された引数listと等しいときに一度だけ更新されます。weekday

実装は次のとおりです。

import calendar

def weekdays(weekday):
    days = [day for day in calendar.day_name]
    for day in days:
        days.insert(0, days.pop())    # add last day as new first day of list           
        if days[0] == weekday:        # if new first day same as weekday then all done
            break       
    return days

出力例:

>>> weekdays("Wednesday")
['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
>>> weekdays("Friday")
['Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday']
>>> weekdays("Tuesday")
['Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday']
于 2010-11-02T23:33:35.737 に答える
1

for ループを実行するたびに、day 変数が変化します。したがって、日は一度だけ入力に等しくなります。「日曜日」を入力として使用して、最初に月曜日が日曜日かどうか、次に火曜日が日曜日かどうか、次に水曜日が日曜日かどうかをチェックし、最終的に日曜日が日曜日であることがわかり、日曜日を返しました。

于 2010-11-02T22:49:15.713 に答える
1

標準ライブラリを使用した別のアプローチ:

days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday',
        'Sunday']
def weekdays(weekday):
  n = days.index(weekday)
  return list(itertools.islice(itertools.cycle(days), n, n + 7))

この場合、Itertools は少し多めです。多くても 1 つの余分なサイクルが必要であることがわかっているため、手動で行うことができます。

days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday',
        'Sunday']
days += days
def weekdays(weekday):
  n = days.index(weekday)
  return days[n:n+7]

どちらも期待される出力を提供します。

>>> weekdays("Wednesday")
['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
>>> weekdays("Sunday")
['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
>>> weekdays("Monday")
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
于 2010-11-08T05:29:22.763 に答える