在字符串中插入可变数量的参数的最pythonic方法是什么?
例如:
给定一个可变日期格式,其形式可以是: YYYY-MM-DD,YYYY-MM-DD HH,YYYY-MM-DD HH:MM或YYYY-MM-DD HH:MM:SS。
我想将年,月,日,小时,分钟,秒的值插入字符串,类似于这样的语句:
"%d/%d/%d %d:%d:%d" % (variable number of arguments here)
这样,上述字符串的print语句将输出一个日期,在可能的情况下,插入实际值,如果它们不可用,则插入默认值0。
请注意我不是在寻找这个特定示例的解决方案,我正在寻找一个解决方案来解决我在开始时提出的更一般的问题(这应该适用于所提供的示例)。我也在寻找一个不会涉及if ... elif ... else块的解决方案。
答案 0 :(得分:2)
使用str.format
方法而不是C中的旧%s
printf样式更加Pythonic。使用内置模块也更加Pythonic:
>>> import datetime
>>> args1 = 2014, 10, 01
>>> args2 = 2014, 10, 01, 12
>>> args3 = 2014, 10, 01, 12, 25
>>> '{0}'.format(datetime.datetime(*args1))
'2014-10-01 00:00:00'
>>> '{0}'.format(datetime.datetime(*args2))
'2014-10-01 12:00:00'
>>> '{0}'.format(datetime.datetime(*args3))
'2014-10-01 12:25:00'
如果您想要更广泛的答案
在字符串中插入可变数量的参数的最pythonic方法是什么?
然后你可以定义一个函数来做到这一点,使用必需参数的位置参数和可选参数的关键字参数:
def format_args(arg1, arg2, arg3, arg4=0, arg5=0, arg6=0):
return '{0}, {1}, {2}, {3}, {4}, {5}'.format(
arg1, arg2, arg3, arg4, arg5, arg6)
用法:
>>> format_args(*args1)
'2014, 10, 1, 0, 0, 0'
>>> format_args(*args2)
'2014, 10, 1, 12, 0, 0'
>>> format_args(*args3)
'2014, 10, 1, 12, 25, 0'
答案 1 :(得分:1)
同意使用datetime比家庭滚动解决方案更可取。要回答在具有不同参数数量的格式字符串中插入变量参数的更一般问题:%运算符需要特定数量的参数,但string.format只需要最小数量。提供一个函数,使用默认值填充您的起始参数,然后您可以将其输入格式化。
from itertools import chain
date_only = [ 2014, 2, 29 ]
date_and_time = [ 2014, 10, 23, 4, 20, 0 ]
defaults = [ 0 ] * 6 # the most arguments your format string requires
date_strs = [ "{} {} {}", "{} {} {} {} {} {}" ]
for s in date_strs:
print(s.format(*chain(date_only, defaults)))
print(s.format(*chain(date_and_time, defaults)))
输出:
2014 2 29
2014 10 23
2014 2 29 0 0 0
2014 10 23 4 20 0