17

I am looking for a clean way to combine variables into a single string with a predefined separator. The problem is that sometimes some of these variables wont always exist or can be set to None. I cant have the separator string duplicate either. Example of problem:

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

Is there a nice clean way to do this?

4

3 回答 3

27

You can use a comprehension to populate your iterable with a conditional checking that values have a truthy value.

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

'-'.join(item for item in your_list if item)
于 2012-06-20T12:14:33.930 回答
6

If you want to keep the number of items constant (for instance because you want to output to a spreadsheet where the list is a row and each item represents a column), use:

your_list = ['key', 'type', 'frequency', 'context_A', None, 'context_C']
'\t'.join(str(item) for item in your_list)

BTW this is also the way to go if any of the items you want to join are integers.

于 2013-03-07T12:32:25.943 回答
5

You can use filter(bool, your_list) or filter(None, your_list) to remove anything that evaluates to False when converted to a bool, such as False, None, 0, [], (), {}, '', maybe others.

You can use locals().get('mightnotexist') or globals().get('mightnotexist'), depending on whether the variable is expected to be local or global, to reference a variable that might not exist. These will return None if the variable doesn't exist.

Your code might become:

items = ('productX',
         'deployment-package',
         '1.2.3.4',
         locals().get('idontexist'),
         globals().get('alsonotexist'),
         None,
         None,
         '')
'-'.join(filter(bool, items))
于 2015-02-28T04:40:27.530 回答