返回星期一列表

返回星期一列表

问题描述:

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

我在做什么错误?

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

不错,简单的解决方案) – Gusto 2010-11-04 10:25:21

每次运行for循环时,day变量都会改变。所以,一天只能输入一次。使用“星期天”作为输入,首先检查星期一=星期日,星期二=星期日,星期三=星期日,直到星期日=星期日,星期天返回。

嗯,你目前只搜索给定的工作日,并设置为结果:) 你可以用切片的能力在Python列表要做到这一点:

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

好主意 - 基本上只是循环旋转'days'列表,以便请求“周日”是第一个结果。然而,只找一次索引会更好,但只需要两行。 (另外,还有一个错字,最后的'weekdays'应该是'weekday')。 – martineau 2010-11-03 00:10:09

这里的越多,你想要什么:

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

究竟是什么,我想到:) – st0le 2010-11-08 08:05:13

更快的方法是记住,工作日周期。因此,我们只需要在第一天就要包含列表,并将其余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'] 
+0

应该是我= days.index(工作日) – ncray 2010-11-03 00:00:03

+0

@ncray:呃,谢谢,没有注意到我的两个版本之间有一个命名上的差异! – poke 2010-11-03 00:04:32

result变量是一个字符串,而不是一个列表对象。另外,正如其他人所提到的,它只会被更新一次,即它等于通过的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 

的原因,你的代码只返回一个日期名是因为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文章,一周中的某些日子的名称不会像法语那样用大写字母表示,但这也是自动考虑的,这意味着传递给它的名称必须是weekday使用当前语言环境的语言,并且也区分大小写。当然,如果需要,您可以修改该函数以忽略输入参数的lettercase。

# 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'] 
+0

这段代码,你如何得到天:***'days = [datetime.date(2001,1,i).strftime('%A')for i in range(1 ,8)]'*** – andi 2013-10-15 23:44:32

+1

该行代码通过从已知日期开始调用'datetime.date.strftime('%A')'七次来生成一周中所有星期几的名称列表星期一。这样做意味着没有必要将星期几名称硬编码到代码中,因此它变成区域独立的,因为被调用的函数是。 – martineau 2013-10-16 00:04:49

使用标准库的另一种方法:

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

你不需要硬编码平日阵列。它已在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)] 

没有人简洁奠定了什么(我认为)是最快的解决方案:

def weekdays(weekday): 
    x = days.index(weekday) 
    return days[x:] + days[:x] 

不到电话,只使用.index()一次,并有效地切片使得这个几乎快一倍Poke's answer

另一种选择是使用collections.deque,比第一种方式慢,但整齐的在其能力rotate()

from collections import deque 
def weekdays(weekday): 
    x = deque(days) 
    x.rotate(-days.index(weekday)) 
    return list(x)