返回工作日列表

时间:2010-11-02 22:44:49

标签: python

我的任务是定义一个函数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'

我做错了什么?

10 个答案:

答案 0 :(得分: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']

除了不需要在函数中硬编码日期名称之外,使用datetime模块的另一个好处是使用它的代码将自动用于其他语言。这可以通过更改语言环境然后使用相应语言的日期名称调用函数来说明。

例如,尽管法国不是我的默认语言环境,但我可以将其设置为当前用于测试目的的语言环境,如下所示。注意:根据这篇Capitalization of day names文章,一周中的日期名称没有像法语中那样大写,因为它们在我的默认英语语言环境中,但也会自动考虑,这意味着{{1传递给它的名称必须是当前语言环境的语言,并且区分大小写。当然,如果需要,你可以修改函数来忽略输入参数的字母大小。

weekday

答案 1 :(得分: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']

答案 2 :(得分: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)

答案 3 :(得分:4)

嗯,你目前只搜索给定的工作日并设置为结果:) 您可以使用python列表中的切片功能来执行此操作:

result = days[days.index(weekday):] + days[:days.index(weekdays)]

答案 4 :(得分:4)

以下是您想要的更多内容:

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

答案 5 :(得分:3)

您不需要对工作日的数组进行硬编码。它已在calendar module中提供。

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)]

答案 6 :(得分:1)

每次运行for循环时,day变量都会更改。所以一天只等于您的输入一次。使用“星期日”作为输入,它首先检查星期一=星期日,然后星期二=星期日,然后星期三=星期日,直到它终于找到星期日=星期日并返回星期日。

答案 7 :(得分: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有点多了。由于您最多需要一个额外的周期,因此您可以手动执行此操作:

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']

答案 8 :(得分:0)

您的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']

答案 9 :(得分:0)

下面的代码将根据您想要的 X 天生成一个列表,如果您想要生成返回的天数列表,请更改 [ 减号到加号 ]

import datetime
numdays = 7
base = datetime.date.today()
date_list = [base + datetime.timedelta(days=x) for x in range(numdays)]
date_list_with_dayname = ["%s, %s" % ((base + datetime.timedelta(days=x)).strftime("%A"),  base + datetime.timedelta(days=x)) for x in range(numdays)]