字符串从包含字符串的Iterable和(NoneType/Undefined)连接

uni*_*ion 9 python

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

  • 您不能使用“if item.strip()”,因为它会在 None 或任何其他不支持 strip() 的对象上失败 (2认同)
  • @Ashwini Chaudhary:那应该是`if item和item.strip()` (2认同)

Tay*_*ayo 6

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

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)