返回星期一列表
我的任务是定义一个函数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)
每次运行for循环时,day变量都会改变。所以,一天只能输入一次。使用“星期天”作为输入,首先检查星期一=星期日,星期二=星期日,星期三=星期日,直到星期日=星期日,星期天返回。
嗯,你目前只搜索给定的工作日,并设置为结果:) 你可以用切片的能力在Python列表要做到这一点:
result = days[days.index(weekday):] + days[:days.index(weekdays)]
好主意 - 基本上只是循环旋转'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]
究竟是什么,我想到:) – 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']
你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']
使用标准库的另一种方法:
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)
不错,简单的解决方案) – Gusto 2010-11-04 10:25:21