Creating strings of the form “a, b, c and d” from a list [‘a’, ‘b’, ‘c’, ’d’] is a task I faced some time ago, as I needed to include such strings in some HTML documents. The “,” and the “and” are included according to the amount of elements. [‘a’, ‘b’] yields “a and b”, [‘a’] yields “a” for example. In a recent review to the code, I changed the method from using string concatenation:
if len(items) > 1: text = items for item in items[1:-1]: text += ', ' + item text += ' and ' + items[-1] else: text = items
to the use of slicing of the items list, addition of the resulting sublists and str.join to include the punctuation:
first = items[:1] middle = items[1:-1] last = items[1:][-1:] first_middle = [', '.join(first + middle)] text = ' and '.join(first_middle + last)
The old method requires an additonal elif branch to work when items is an empty list; the new method returns an empty string if the items list is empty. I share this tip in case it is useful to someone else.