12

我的任务是定义一个返回工作日列表的函数,从给定的 weekdayweekdays(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

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

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

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模块的另一个优点是使用它的代码将自动在其他语言中工作。这可以通过更改语言环境然后使用相应语言的日期名称调用函数来说明。

例如,虽然法国不是我的默认语言环境,但我可以将其设置为当前语言环境以进行测试,如下所示。注意:根据this Capitalization of day names article,星期几的名称在法语中不像在我的默认英语语言环境中那样大写,但这也会被自动考虑在内,这意味着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 个元素添加到末尾。或者换句话说,我们从起始日开始获取工作日列表,追加另一个完整的一周,并且只返回前 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']
于 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 list 中的切片功能来执行此操作:

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 回答
4

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

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)]
于 2014-07-09T05:03:46.957 回答
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 有点多。由于您知道最多需要一个额外的周期,因此您可以手动执行此操作:

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 回答
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)]
于 2021-05-30T18:21:01.500 回答