我正在寻找一种干净的方法,将变量组合成带有预定义分隔符的单个字符串。问题是有时其中一些变量并不总是存在或可以设置为 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---'
有没有一种很好的干净方法可以做到这一点?
导式通过条件检查值是否具有真实值来填充可迭代对象。
your_list = [
'productX',
'deployment-package',
'1.2.3.4',
None,
None,
None,
]
'-'.join(item for item in your_list if item)
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))
如果要保持项目数不变(例如,因为您要输出到列表是一行,每个项目代表一列的电子表格),请使用:
your_list = ['key', 'type', 'frequency', 'context_A', None, 'context_C']
't'.join(str(item) for item in your_list)
顺便说一句,如果您要加入的任何项目是整数,这也是要走的路。