返回工作日列表

Gus*_*sto 10 python

我的任务是定义一个weekdays(weekday)从工作日开始返回工作日列表的函数.它应该像这样工作:

>>> weekdays('Wednesday')
['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经想出了这个:

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

但这仅打印输入日:

>>> weekdays("Sunday")
'Sunday'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

mar*_*eau 15

你的代码只返回一天名称的原因是因为它weekday永远不会匹配days元组中的多个字符串,因此不会添加其后的任何一天(也不会包含在它之前的那些日子).即使它以某种方式执行,它仍然会将它们全部作为一个长字符串返回,因为您正在初始化result为空字符串,而不是空字符串list.

这是一个解决方案,它使用该datetime模块创建一个以当前语言环境的语言以"Monday"开头的所有工作日名称的列表.然后使用此列表以返回的所需顺序创建另一个名称列表.它通过在原始列表中查找指定日期的索引然后将其相对于该索引的两个片段拼接在一起来形成结果来进行排序.作为优化,它还会缓存区域设置的日期名称,因此如果它再次使用相同的当前区域设置(可能的场景)再次调用,则不需要重新创建此私有列表.

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']
Run Code Online (Sandbox Code Playgroud)

除了不需要在函数中硬编码日期名称之外,使用该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']
Run Code Online (Sandbox Code Playgroud)


pok*_*oke 10

一个更快的方法是记住,工作日周期.因此,我们只需要获得包含列表的第一天,并将剩余的6个元素添加到最后.或者换句话说,我们从开始日开始获取工作日列表,追加另一整周,并仅返回前7个元素(整周).

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']
Run Code Online (Sandbox Code Playgroud)


toa*_*oza 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
Run Code Online (Sandbox Code Playgroud)

如果你想测试它的工作原理:

def test_weekdays():
    days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
    for day in days:
        print weekdays(day)
Run Code Online (Sandbox Code Playgroud)


Shi*_*hah 6

您不需要对工作日数组进行硬编码。它已经在日历模块中可用。

import calendar as cal

def weekdays(weekday):
    start = [d for d in cal.day_name].index(weekday)
    return [cal.day_name[(i+start) % 7] for i in range(7)]
Run Code Online (Sandbox Code Playgroud)