def abbreviate(to_abbreviate):
phrase = to_abbreviate.replace("-", " ").replace("_", " ").upper().split()
return "".join([word[0] for word in phrase])
- This approach begins by using
str.replace()onto_abbreviateto convert non-letter characters such as-and_into spaces. - The phrase is then upper-cased by calling
str.upper(). - Finally, the phrase is turned into a
listof words by callingstr.split().
The three methods above are all chained together, with each method operating on the output of the method before it in the "chain".
This works because both replace() and upper() operate on strings (as they are str methods) and return strings.
If split() was called first, replace() and upper() would fail, since they cannot operate on the list returned by split().
re.findall() or re.finditer() can also be used to clean to_abbreviate.
These two methods from the re module will return a list or a lazy iterator of results, respectively.
As of this writing, both of these methods benchmark slower than using str.replace() for cleaning.
A list comprehension is then used to iterate through the phrase and select the first letters of each word via bracket notation.
This comprehension is passed into str.join(), which unpacks the list of first letters and joins them together using an empty string — the acronym.
Other "separator" strings besides an empty string can be used with str.join() — see string-methods for some additional examples.
Since the comprehension and join() are fairly succinct, they are put directly on the return line, rather than assigning and returning an intermediate variable for the acronym.
The weakness of this solution is that it is taking up extra space with the list comprehension, which is creating and saving a list in memory — only to have that list immediately unpacked by the str.join() method.
While this is trivial for the inputs this problem is tested against, it could become a problem if the inputs get longer.
It could also be an issue if the code were deployed in a memory-constrained environment.
A generator expression here would be more memory-efficient, though there are speed tradeoffs.
See the generator expression approach for more details.