【问题标题】:How to efficiently join a list with commas and add "and" before the last element如何有效地用逗号加入列表并在最后一个元素之前添加“and”
【发布时间】:2015-08-14 11:15:11
【问题描述】:

我一直在经历Automatetheboringstuff 并遇到了一个名为逗号代码的挑战(chapter 4 的结尾)。您必须编写一个函数,该函数接受一个列表并打印出一个字符串,用逗号连接元素并在最后一个元素之前添加“and”。

请记住,我对 python 还是相当陌生,或者为此进行编程,这仍然是一项易于管理的任务,但输出在插入的“and”之前有一个逗号。所以我修改了代码来清理它。这是我的代码:

def comma_separator(someList):
    """The function comma_separator takes a list and joins it
       into a string with (", ") and adds " and " before the last value."""

    if type(someList) is list and bool(someList) is True:
        return ", ".join(someList[:-1]) + " and " + someList[-1]
    else:
        print("Pass a non-empty list as the argument.")

有没有更好的方法呢?有没有可以做到这一点的模块?

【问题讨论】:

    标签: python list


    【解决方案1】:

    您必须考虑只有 one 元素的情况:

    def comma_separator(sequence):
        if not sequence:
            return ''
        if len(sequence) == 1:
            return sequence[0]
        return '{} and {}'.format(', '.join(sequence[:-1]), sequence[-1])
    

    请注意,bool(sequence) is True 是一种非常精细的测试非空列表的方法;只需使用 if sequence: 就足够了,因为 if 语句正在寻找布尔值已经

    可以说,使用序列以外的任何东西(可以被索引并具有长度的东西)调用函数应该只会导致异常。您通常不会测试此类函数中的类型。如果您确实必须测试某个类型,请使用isinstance(sequence, list) 至少允许子类。

    我也会将传入一个空列表作为错误。你可以把这个异常变成ValueError

    def comma_separator(sequence):
        if len(sequence) > 1:
            return '{} and {}'.format(', '.join(sequence[:-1]), sequence[-1])
        try:
            return sequence[0]
        except IndexError:
            raise ValueError('Must pass in at least one element')
    

    后者的演示:

    >>> def comma_separator(sequence):
    ...     if len(sequence) > 1:
    ...         return '{} and {}'.format(', '.join(sequence[:-1]), sequence[-1])
    ...     try:
    ...         return sequence[0]
    ...     except IndexError:
    ...         raise ValueError('Must pass in at least one element')
    ... 
    >>> comma_separator(['foo', 'bar', 'baz'])
    'foo, bar and baz'
    >>> comma_separator(['foo', 'bar'])
    'foo and bar'
    >>> comma_separator(['foo'])
    'foo'
    >>> comma_separator([])
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 7, in comma_separator
    ValueError: Must pass in at least one element
    

    【讨论】:

      【解决方案2】:

      作为Martijn's readable answer 的替代品,您可以使用两个str.join();用逗号连接给定序列中除最后一项之外的所有内容的内连接,以及用and 连接最后一项的内连接结果的外连接。这是一个单行:

      def comma_separator(seq):
          return ' and '.join([', '.join(seq[:-1]), seq[-1]] if len(seq) > 2 else seq)
      
      >>> comma_separator([])
      ''
      >>> comma_separator(['a'])
      'a'
      >>> comma_separator(['a', 'b'])
      'a and b'
      >>> comma_separator(['a', 'b', 'c'])
      'a, b and c'
      >>> comma_separator(['a', 'b', 'c', 'd'])
      'a, b, c and d'
      

      这不会将空序列视为错误,而是返回一个空字符串。

      【讨论】:

        【解决方案3】:
        ', '.join(elements[:-1]) + ' and ' + elements[-1]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-30
          • 2018-06-01
          • 2012-12-16
          • 1970-01-01
          • 1970-01-01
          • 2018-05-17
          • 2011-06-10
          • 1970-01-01
          相关资源
          最近更新 更多