- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
>> week_days_to_string(-6ren">
我得到一个星期几的序列。我想做的 Python 代码:
def week_days_to_string(week_days):
"""
>>> week_days_to_string(('Sunday', 'Monday', 'Tuesday'))
'Sunday to Tuesday'
>>> week_days_to_string(('Monday', 'Wednesday'))
'Monday and Wednesday'
>>> week_days_to_string(('Sunday', 'Wednesday', 'Thursday'))
'Sunday, Wednesday, Thursday'
"""
if len(week_days) == 2:
return '%s and %s' % weekdays
elif week_days_consecutive(week_days):
return '%s to %s' % (week_days[0], week_days[-1])
return ', '.join(week_days)
我只需要 week_days_consecutive
函数(最难的部分)。
我有什么想法可以实现这一目标吗?
澄清:
我的措辞和例子引起了一些困惑。我不仅想将此功能限制在工作周内。我想考虑一周中的所有日子(S、M、T、W、T、F)。很抱歉昨晚没说清楚。编辑了问题的正文以使其更清楚。
编辑:投入一些 Spanner
环绕序列:
>>> week_days_to_string(('Sunday', 'Monday', 'Tuesday', 'Saturday'))
'Saturday to Tuesday'
并且,根据@user470379 和可选:
>>> week_days_to_string(('Monday, 'Wednesday', 'Thursday', 'Friday'))
'Monday, Wednesday to Friday'
最佳答案
我会通过以下方式解决这个问题:
使用 calendar.day_name
、range
和一些用于理解的方法,您可以这样做:
day_indexes = {name:i for i, name in enumerate(calendar.day_name)}
def weekdays_consecutive(days):
indexes = [day_indexes[d] for d in days]
expected = range(indexes[0], indexes[-1] + 1)
return indexes == expected
一些其他选项,具体取决于您的需要:
如果您需要 Python < 2.7,您可以使用:
day_indexes = dict((name, i) for i, name in enumerate(calendar.day_name))
如果您不想允许星期六和星期日,只需剪掉最后两天:
day_indexes = ... calendar.day_name[:-2] ...
如果您需要在周日之后换行,可能最简单的方法是检查每一项是否比前一项多,但要以 7 为模:
def weekdays_consecutive(days):
indexes = [day_indexes[d] for d in days]
return all(indexes[i + 1] % 7 == (indexes[i] + 1) % 7
for i in range(len(indexes) - 1))
更新:对于扩展问题,我仍然会坚持使用他们的 day-to-index dict,但我会:
这是执行此操作的代码:
def weekdays_to_string(days):
# convert days to indexes
day_indexes = {name:i for i, name in enumerate(calendar.day_name)}
indexes = [day_indexes[d] for d in days]
# find the places where sequential days end
ends = [i + 1
for i in range(len(indexes))
if (indexes[(i + 1) % len(indexes)]) % 7 !=
(indexes[(i) % len(indexes)] + 1) % 7]
# wrap the days if necessary to get longest possible sequences
split = ends[-1]
if split != len(days):
days = days[split:] + days[:split]
ends = [len(days) - split + end for end in ends]
# group the days in sequential spans
spans = [days[begin:end] for begin, end in zip([0] + ends, ends)]
# format as requested, with "to", "and", commas, etc.
words = []
for span in spans:
if len(span) < 3:
words.extend(span)
else:
words.append("%s to %s" % (span[0], span[-1]))
if len(days) == 1:
return words[0]
elif len(days) == 2:
return "%s and %s" % tuple(words)
else:
return ", ".join(words)
您也可以尝试以下而不是最后一个 if/elif/else
block 来在最后两个项目之间获得一个“and”并在其他所有项目之间获得逗号:
if len(words) == 1:
return words[0]
else:
return "%s and %s" % (", ".join(words[:-1]), words[-1])
这与规范略有不同,但在我看来更漂亮。
关于Python:将 ('Monday' 、 'Tuesday' 、 'Wednesday' ) 转换为 'Monday to Wednesday',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4482050/
我有一个 9 月 2 日星期二的 GregorianCalendar 实例。 valñue 以毫秒为单位进行检查,没有问题。我想要下一个星期日(7 日)23:59:59 的另一个日历。所以: Greg
我有一个我目前正在重写的网络日程安排应用程序,并且对如何处理重复约会有一些疑问(我知道在重复约会时不乏“什么是最好的方法”) . 所以我想提供定期约会,用户可以在其中安排约会,例如 6 月 2 日,星
我自己编写代码并不太难,但我在想——一定有一些像这样的 javascript 或 php 库已经存在了...... 基本上我想将普通的类似语音的文本,例如“下周一”、“明天”、“Jan 2”、“2/1
我想找到一个库或命令,给定输入如“每三个星期二”将提供日期列表,例如(2010-06-15、2010-07-20、2010-08-17),等等 可以从 python、unix 命令行或 web api
嗨, friend 们,我需要统计周数。 前 1,2,3 .... 52 基于当年。 在 php 中,周默认从星期一或星期日开始 有没有设置'星期二'有默认的开始日期。 我的代码是... echo "
我希望有人能帮助我。我正在尝试构建一个下拉菜单,它会显示接下来 4-6 个星期二的正确日期。这已经在工作了。现在的问题是,我需要以下内容: 如果今天是星期三,下拉列表应该从下周的第一个星期二开始,而不
有没有办法把这段代码总结成1-2行? 我的目标是返回,例如,我有一个 DayOfWeek 是星期一,我想得到之后的一天(星期二)或之后的 n 天。 switch (_RESETDAY
我发现这很难搜索,因为要求有点模棱两可,但我想要的是我想在 mysql 查询中有一个 where 子句: where START_DATE > next Tuesday at 11:59 PM 我将其
我得到一个星期几的序列。我想做的 Python 代码: def week_days_to_string(week_days): """ >>> week_days_to_string(
我目前无法在 azure databricks 中使用 SQL 从日期中提取工作日名称。 我有以下内容: 日期2023-01-012023-01-022023-01-03 我想要的输出是: 日期工作日
我需要了解 Cron 知识的人的帮助。我正在尝试编写 Cron 表达式,该表达式应该每周运行一次,周二运行一次,如果今天是周二,则应立即在周三运行一次。我当前的解决方案是: 0 0 * * 2,3 此
这个问题在这里已经有了答案: Finding the second and fourth Tuesday of the month with Javascript (1 个回答) 关闭 9 年前。
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
嗯, 这是我从网络服务获得的字符串: “2010 年 3 月 30 日星期二上午 10:45” 我需要将其转换为 DateTime。 您知道实现此目的的简单方法吗? 谢谢, 最佳答案 stri
为什么某些 linux shell 的日期时间是 Tue Feb 24 13:03:40 SGT 2009 为什么有些是 Tuesday, February 24, 2009 1:03:41 PM S
我是一名优秀的程序员,十分优秀!