Подтвердить что ты не робот

Как присоединиться к списку в Python, но сделать последний разделитель другим?

Я пытаюсь превратить список в разделенные строки, объединенные с амперсандом, если есть только два элемента или запятые и амперсанд между двумя последними, например.

Jones & Ben
Jim, Jack & James

В настоящее время у меня есть это:

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

и не знаю, как решить проблему с запятой/амперсандом. Начинающий, поэтому полное объяснение будет оценено.

4b9b3361

Ответ 1

"&".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)

Ответ 2

Вы можете разбить это на два соединения. Присоедините все, кроме последнего элемента, с помощью ", ". Затем присоедините эту строку и последний элемент с помощью " & ".

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

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

Примечание. Это не относится к случаям ребер, например, когда authors пуст или имеет только один элемент.

Ответ 3

Один вкладыш. Просто конкатенируйте все, кроме последнего элемента, с , как разделитель. Затем просто добавьте &, а затем последний элемент до конца.

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

Если вы хотите обрабатывать пустые списки или такие:

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

Ответ 4

Вы можете сначала соединить все имена с запятой и использовать regex для замены последней запятой:

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

Ответ 5

('{}, '*(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 ''

Это может обрабатывать список авторов любой длины.

Ответ 6

Похоже, что, когда я работал над своим ответом, кто-то, возможно, избил меня на удар с похожим. Здесь моя для сравнения. Обратите внимание, что это также обрабатывает случаи из 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([]) == ''