更优雅的方式为两个(或更多)其他变量指定一个`str`条件

时间:2017-03-13 09:37:08

标签: python string python-3.x if-statement

我想在另外两个变量的条件下指定一个str(将用作文件名)。假设我有一个基本名称(指定为str类型),file_name = 'filename.txt';我有两个变量,xy,可能是NoneTypestr。我期望通过以下代码实现我的目标:

if x == None and y == None:
    file_name = 'filename.txt'
elif x == 'abc' and y == None:
    file_name = 'filename_abc.txt'
elif x == None and y == 'def':
    file_name = 'filename_def.txt'
else: # both x and y are str
    file_name = 'filename_{}_{}.txt'.format(x, y)

所以基本上,如果x(或y)是非NoneType str,则_中应该有一个额外的下划线file_name。我可以理解,使用ifelif语句可以实现目标。但如果有两个以上(比方说10个)条件变量如xy怎么办?这将是非常漫长的。我想知道是否会有更优雅的方式。

3 个答案:

答案 0 :(得分:2)

只需将参数放在list中,过滤掉None类型,加入字符串,只需使用format插入复合字符串:

params = [None,"abc",None,"def",12]

filename = "filename{}.txt".format("".join(["_{}".format(p) for p in params if p is not None]))


print(filename)

这个解决方案可以转换其他参数,比如列表中的整数(如format会做的那样),也可以正常工作(在Paul的帮助下:) :)只有None个参数

答案 1 :(得分:2)

这个怎么样?

bits = [s for s in (x, y) if not s is None]
file_name = '_'.join(['filename'] + bits) + '.txt'

答案 2 :(得分:1)

你可以使用一些条件表达式:

Header

这会明确检查fx = '_{}'.format(x) if x else '' fy = '_{}'.format(y) if y else '' filename = 'filename{}{}.txt'.format(fx, fy) x的粗暴度,然后调用格式,因此适用yx的所有非假值。

如果您只需要字符串,请将y替换为if x,将if isinstance(x, str)替换为y