我正在寻找一种干净的方法,将变量组合成一个带有预定义分隔符的单个字符串。问题是有时这些变量中的一些不会总是存在或者可以设置为None。我不能让分隔符字符串重复。问题示例:
# This works because I have all strings
str('-').join(('productX', 'deployment-package', '1.2.3.4'))
# 'productX-deployment-package-1.2.3.4'
# But I have more args that might be None / or not exist like and that breaks
str('-').join(('productX', 'deployment-package', '1.2.3.4', idontexist, alsonotexist))
str('-').join(('productX', 'deployment-package', '1.2.3.4', None, None, None))
# If I set the other missing variables to empty strings, I get duplicated joiners
str('-').join(('productX', 'deployment-package', '1.2.3.4', '', '', ''))
# 'productX-deployment-package-1.2.3.4---'
有一个很好的干净方法吗?
答案 0 :(得分:17)
您可以使用理解来填充您的iterable,条件检查值是否具有真值。
your_list = ['productX', 'deployment-package', '1.2.3.4', None, None, None]
'-'.join(item for item in your_list if item)
答案 1 :(得分:2)
如果要保持项目数不变(例如,因为您想要输出到列表为行且每个项目代表一列的电子表格),请使用:
your_list = ['key', 'type', 'frequency', 'context_A', None, 'context_C']
'\t'.join(str(item) for item in your_list)
顺便说一下,如果您要加入的任何项目都是整数,这也是一种方法。
答案 2 :(得分:2)
您可以使用filter(bool, your_list)
或filter(None, your_list)
删除转换为bool时评估为False的任何内容,例如False,None,0,[],(),{},'',也许其他人。
您可以使用locals().get('mightnotexist')
或globals().get('mightnotexist')
,以取决于变量是本地变量还是全局变量,以引用可能不存在的变量。如果变量不存在,这些将返回None。
您的代码可能会变为:
items = ('productX',
'deployment-package',
'1.2.3.4',
locals().get('idontexist'),
globals().get('alsonotexist'),
None,
None,
'')
'-'.join(filter(bool, items))