Как присоединиться к списку в Python, но сделать последний разделитель другим?
Я пытаюсь превратить список в разделенные строки, объединенные с амперсандом, если есть только два элемента или запятые и амперсанд между двумя последними, например.
Jones & Ben
Jim, Jack & James
В настоящее время у меня есть это:
pa = ' & '.join(listauthors[search])
и не знаю, как решить проблему с запятой/амперсандом. Начинающий, поэтому полное объяснение будет оценено.
Ответы
Ответ 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([]) == ''