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))