从包含字符串和(无类型/未定义)的可迭代对象连接的字符串



我正在寻找一种干净的方法,将变量组合成带有预定义分隔符的单个字符串。问题是有时其中一些变量并不总是存在或可以设置为 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)

顺便说一句,如果您要加入的任何项目是整数,这也是要走的路。

最新更新