Python 从包含字符串和(非类型/未定义)的Iterable连接的字符串

Python 从包含字符串和(非类型/未定义)的Iterable连接的字符串,python,Python,我正在寻找一种干净的方法,用预定义的分隔符将变量组合成单个字符串。问题是,有时这些变量中的一些并不总是存在,或者可以设置为“无”。我也不能让分隔符字符串重复。问题示例: # 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

我正在寻找一种干净的方法,用预定义的分隔符将变量组合成单个字符串。问题是,有时这些变量中的一些并不总是存在,或者可以设置为“无”。我也不能让分隔符字符串重复。问题示例:

# 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---'

有没有一种干净的方法可以做到这一点?

您可以使用一种理解来使用条件检查填充iterable,以确保值具有真实值

your_list = [
  'productX', 
  'deployment-package', 
  '1.2.3.4', 
  None, 
  None, 
  None,
]

'-'.join(item for item in your_list if item)

如果要保持项目数不变(例如,因为要输出到电子表格,其中列表是一行,每个项目代表一列),请使用:

顺便说一句,如果您想要加入的任何项目都是整数,那么这也是一种方法。

您可以使用
过滤器(bool,您的列表)
过滤器(None,您的列表)
删除任何在转换为bool时计算为False的内容,例如False、None、0、[]、(,{},,,,,,,,,可能还有其他内容

您可以使用
locals()。如果变量不存在,这些将返回None

您的代码可能会变成:

items = ('productX',
         'deployment-package',
         '1.2.3.4',
         locals().get('idontexist'),
         globals().get('alsonotexist'),
         None,
         None,
         '')
'-'.join(filter(bool, items))

最好使用
'-'.join
而不是
str('-')。join
我更喜欢这个答案,因为它还可以根据OP的需要处理空字符串。使用
if item.strip()
也可以处理空字符串。不能使用“if item.strip()”,因为它在任何对象或任何其他不支持strip()的对象上都会失败@JonClements如果item或item.strip()
@Ashwini Chaudhary:那应该是
如果item和item.strip()
按照这种方式,它将值
None
放在字符串中,如so
“键、类型、频率、上下文A、无、上下文C”
。我想大多数人都希望使用空字符串。为此,我使用了
,'.join(项目或列表中项目的“”)
来获取
“键、类型、频率、上下文A、上下文C”
。但是,由于我必须删除
str()
包装器,因此您无法使用它来转换整数。如果您碰巧在验证输入时其中一个允许值为“无”,这是一个很好的解决方案。我确实更喜欢此解决方案,因为它在我的文档中不太可读。
items = ('productX',
         'deployment-package',
         '1.2.3.4',
         locals().get('idontexist'),
         globals().get('alsonotexist'),
         None,
         None,
         '')
'-'.join(filter(bool, items))