Converting a list into comma-separated string with “and” before the last item - Python 2.7

前端 未结 10 1048
借酒劲吻你
借酒劲吻你 2020-12-18 22:19

I have created this function to parse the list:

listy = [\'item1\', \'item2\',\'item3\',\'item4\',\'item5\', \'item6\']


def coma(abc):
    for i in abc[0:-         


        
相关标签:
10条回答
  • 2020-12-18 22:50

    In python, many functions, that work with lists also works with iterators (like join, sum, list). To get the last item of a iterable is not that easy, because you cannot get the length, because it may be unknown in advance.

    def coma_iter(iterable):
        sep = ''
        last = None
        for next in iterable:
            if last is not None:
                yield sep
                yield last
                sep = ', '
            last = next
        if sep:
            yield ', and '
        if last is not None:
            yield last
    
    print ''.join(coma_iter(listy))
    
    0 讨论(0)
  • 2020-12-18 22:52

    When there are 1+ items in the list (if not, just use the first element):

    >>> "{} and {}".format(", ".join(listy[:-1]),  listy[-1])
    'item1, item2, item3, item4, item5, and item6'
    

    Edit: If you need an Oxford comma (didn't know it even existed!) -- just use: ", and" isntead.

    0 讨论(0)
  • 2020-12-18 22:52

    It's generally bad practice to use + when combining strings, as it is generally slow. Instead, you can use

    def comma(items):
        return "{}, and {}".format(", ".join(items[:-1]), items[-1])
    

    You should note, however, that this will break if you only have one item:

    >>> comma(["spam"])
    ', and spam'
    

    To solve that, you can either test the length of the list (if len(items) >= 2:), or do this, which (imho) is slightly more pythonic:

    def comma(items):
        start, last = items[:-1], items[-1]
    
        if start:
            return "{}, and {}".format(", ".join(start), last)
        else:
            return last
    

    As we saw above, a single item list will result in an empty value for items[:-1]. if last: is just a pythonic way of checking if last is empty.

    0 讨论(0)
  • 2020-12-18 22:55
    def oxford_comma_join(l):
        if not l:
            return ""
        elif len(l) == 1:
            return l[0]
        else:
            return ', '.join(l[:-1]) + ", and " + l[-1]
    
    print(oxford_comma_join(['item1', 'item2', 'item3', 'item4', 'item5', 'item6']))
    

    Output:

    item1, item2, item3, item4, item5, and item6
    

    Also as an aside the Pythonic way to write

    for i in abc[0:-1]:
    

    is

    for i in abc[:-1]:
    
    0 讨论(0)
  • 2020-12-18 23:00

    You can also try the quoter library

    >>> import quoter
    >>> mylist = ['a', 'b', 'c']
    >>> quoter.and_join(mylist)
    'a, b, and c'
    >>> quoter.or_join(mylist)
    'a, b, or c'
    

    https://pypi.python.org/pypi/quoter

    0 讨论(0)
  • 2020-12-18 23:01
    def coma(lst):
        return '{} and {}'.format(', '.join(lst[:-1]), lst[-1])
    
    0 讨论(0)
提交回复
热议问题