我正在寻找一种干净的方法,将变量组合成一个带有预定义分隔符的单个字符串.问题是有时这些变量中的一些不会总是存在或者可以设置为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---'
Run Code Online (Sandbox Code Playgroud)
有一个很好的干净方法吗?
dm0*_*514 18
您可以使用理解来填充您的iterable,条件检查值是否具有真值.
your_list = ['productX', 'deployment-package', '1.2.3.4', None, None, None]
'-'.join(item for item in your_list if item)
Run Code Online (Sandbox Code Playgroud)
如果您想保持项目数不变(例如,因为您想输出到电子表格,其中列表是一行,每个项目代表一列),请使用:
your_list = ['key', 'type', 'frequency', 'context_A', None, 'context_C']
'\t'.join(str(item) for item in your_list)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果您要加入的任何项目是整数,这也是要走的路。
小智 5
您可以使用filter(bool, your_list)或filter(None, your_list)删除在转换为布尔值时计算为 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))
Run Code Online (Sandbox Code Playgroud)