如何在Python中加入列表但是使最后一个分隔符不同?

时间:2015-05-06 17:43:12

标签: python

如果只有两个项目,或者在最后两个项目之间使用逗号和符号,我试图将列表转换为用&符号连接的单独字符串,例如。

Jones & Ben
Jim, Jack & James

我目前有这个:

pa = ' & '.join(listauthors[search])

并且不知道如何整理逗号/&符问题。初学者如此完整的解释将不胜感激。

9 个答案:

答案 0 :(得分:22)

"&".join([",".join(my_list[:-1]),my_list[-1]])

我认为会起作用

或者只是

",".join(my_list[:-1]) +"&"+my_list[-1]

处理只有2项你可以

的边缘情况
"&".join([",".join(my_list[:-1]),my_list[-1]] if len(my_list) > 2 else my_list)

答案 1 :(得分:14)

你可以把它分成两个连接。使用", "加入除最后一项之外的所有项目。然后使用" & "加入此字符串和最后一项。

all_but_last = ', '.join(authors[:-1])
last = authors[-1]

' & '.join([all_but_last, last])

注意:这不会处理边缘情况,例如authors为空或只有一个元素时。

答案 2 :(得分:9)

一个班轮。只是将最后一个元素与,连接起来作为分隔符。然后只需追加&,然后将最后一个元素追加到最后。

print ', '.join(lst[:-1]) + ' & ' + lst[-1]

如果您希望处理空列表等:

if len(lst) > 1:
    print ', '.join(lst[:-1]) + ' & ' + lst[-1]
elif len(lst) == 1:
    print lst[0]

答案 3 :(得分:3)

您可以先使用逗号加入所有名称,然后使用正则表达式替换最后一个逗号:

>>> import re
>>> l=['Jim','Jack','James','Zahra','Kasra']
>>> re.sub(r', (\w+)$',r'& \1',' , '.join(l))
'Jim , Jack , James , Zahra & Kasra'

答案 4 :(得分:3)

('{}, '*(len(authors)-2) + '{} & '*(len(authors)>1) + '{}').format(*authors)

此解决方案可以处理长度为>的作者列表。 0,虽然它也可以修改为处理0长度列表。我们的想法是首先创建一个格式字符串,我们可以通过解压缩列表来格式化。这个解决方案避免了对列表进行切片,因此对于大型作者列表来说它应该是相当有效的。

首先,我们为两位作者之外的每位其他作者连接'{}, '。然后,如果有两个或更多作者,我们会连接'{} & '。最后,我们为最后一位作者附加'{}',但如果我们希望能够处理空的作者列表,则此子表达式可以是'{}'*(len(authors)>0)。最后,我们通过使用*解包语法解压缩列表的元素来格式化完成的字符串。

如果您不需要单行代码,请使用高效函数形式的代码。

def format_authors(authors):
    n = len(authors)
    if n > 1:
        return ('{}, '*(n-2) + '{} & {}').format(*authors)
    elif n > 0:
        return authors[0]
    else:
        return ''

这可以处理任意长度的作者列表。

答案 5 :(得分:2)

看起来,当我正在处理我的答案时,有人可能会用类似的打败我。这是我的比较。请注意,这也会处理列表中0,1或2个成员的情况。

# Python 3.x, should also work with Python 2.x.
def my_join(my_list):
    x = len(my_list)
    if x > 2:
        s = ', & '.join([', '.join(my_list[:-1]), my_list[-1]])
    elif x == 2:
        s = ' & '.join(my_list)
    elif x == 1:
        s = my_list[0]
    else:
        s = ''
    return s

assert my_join(['Jim', 'Jack', 'John']) == 'Jim, Jack, & John'
assert my_join(['Jim', 'Jack']) == 'Jim & Jack'
assert my_join(['Jim',]) == 'Jim'
assert my_join([]) == ''

答案 6 :(得分:1)

只是一个语法更正确的例子:)

add_action( 'pre_get_posts', 'products_pre_get_posts' );
function products_pre_get_posts( WP_Query $query ) {
    if ( is_admin() && $query->is_main_query() && $query->query_vars['post_type'] == 'product' ) {
        $query->set( 'tax_query', array(
            array(
                'taxonomy' => 'product_cat',
                'field'    => 'term_id',
                'terms'    => get_terms( array( 'taxonomy' => 'product_cat', 'fields' => 'ids' ) )
            )
        ) );
    }
}

输出示例:

def list_of_items_to_grammatical_text(items):
    if len(items) <= 1:
        return ''.join(items)
    if len(items) == 2:
        return ' and '.join(items)
    return '{}, and {}'.format(', '.join(items[:-1]), items[-1])

答案 7 :(得分:0)

这是一个简单的例子,也适用于空列表或1个元素列表:

' and '.join([', '.join(mylist[:-1])]+mylist[-1:])

它起作用的原因是对于[:-1]和[-1:]的空列表,再次给我们一个空列表

答案 8 :(得分:0)

这是一个处理所有边缘情况(空列表,一个条目,两个条目)的单行示例:

' & '.join(filter(None, [', '.join(my_list[:-1])] + my_list[-1:]))

filter()函数用于过滤掉my_list为空或只有一个条目时发生的空条目。