хорошо, в основном я задаю вопрос об их имени Я хочу, чтобы это был один ввод, а не Имя и Фамилия.
Есть ли способ разделить это имя? и взяв только последнее слово из "Приговора", например
name = "Thomas Winter"
print name.split()
и что бы на выходе было просто "Зима"
См. Также stackoverflow.com/questions/1122328/…






Нравится:
print name.split()[-1]
print name.split () [- 1] обратите внимание на ()
Извиняюсь. Я немного поврежден Рубином.
Вероятно, вы захотите использовать для этого rsplit:
rsplit([sep [,maxsplit]])
Вернуть список слов в строке, используя sep в качестве строки-разделителя. Если указан maxsplit, выполняется самое большее разбиение maxsplit, самые правые. Если не указан sep или None, любая строка с пробелами является разделителем. За исключением разделения справа, rsplit() ведет себя как split(), который подробно описан ниже. Новое в версии 2.4.
Проблема с попыткой разделить имена из одного входа заключается в том, что вы не получите полную фамилию для людей, в которых есть пробелы, и я не верю, что вы сможете написать код для полного управления этим.
Я бы порекомендовал вам спрашивать имена отдельно, если это вообще возможно.
Согласны, а как насчет, скажем, Майка Сент-Джеймса, например? Будет возвращена неправильная фамилия.
Энн Мари ван Гвидо. Где заканчивается имя и начинается фамилия ?! Человечество!
Не говоря уже о культурах, где фамилия дается первой. Спрашивать имя сразу - это нормально, только если вы всегда относитесь к нему как к единой единице. Попытка разделить его обычно приводит к искажению некоторых случаев.
Некоторые имена также имеют апостроф или другие специальные символы, которые вызывают проблемы при неправильной обработке. Многие ирландские имена, например О'Коннор, попади в эту категорию.
Как человек, у которого несколько фамилий, я получаю удовольствие от этих ответов ... ;-)
@Ryan: или у них нет апострофа, например "Gearóid Ó Súilleabháin" ... для которого у вас может быть дублированная запись в базе данных, хранящаяся под "Джерардом О'Салливаном" :-)
Разделить имена сложнее, чем кажется. Некоторые имена имеют двухсловные фамилии; некоторые люди будут вводить имя, отчество и фамилию; у некоторых имен есть два рабочих имени. Более надежный (или наименее ненадежный) способ обработки имен - всегда записывать имя и фамилию в отдельные поля. Конечно, это поднимает свои собственные проблемы, например, как обращаться с людьми с одним именем, чтобы убедиться, что это работает для пользователей, у которых другой порядок частей имени.
Имена жесткие, обращайтесь осторожно.
Вот как это сделать в SQL. Но нормализация данных с помощью такого рода вещей действительно медвежья. Я согласен с Дэйвом ДюПлантисом в отношении запроса отдельных материалов.
Вы обнаружите, что ваша ключевая проблема с этим подходом не техническая, а человеческая: разные люди пишут свои имена по-разному.
Фактически, терминология «имя» и «фамилия» сама по себе ошибочна.
В то время как многие смешанные семьи используют фамилию через дефис, например, Смит-Джонс, есть некоторые, которые просто используют оба имени по отдельности, «Смит Джонс», где оба имени являются фамилией.
Многие европейские фамилии состоят из нескольких частей, таких как «де Вер» и «ван ден Нейулаар». Иногда у этих статистов есть важная семейная история - например, префикс, присвоенный королем сотни лет назад.
Дополнительная проблема: я правильно написал их для людей, на которых я ссылаюсь - «de» и «van den» не получают заглавные буквы для некоторых семей, но имеют для других.
И наоборот, во многих азиатских культурах фамилия ставится на первое место, потому что семья считается более важной, чем личность.
Последний пункт - некоторые люди придают большое значение тому, чтобы быть "младшим", "старшим" или "третьим" - и ваш код не должен рассматривать их как фамилию.
Также отмечая, что довольно много людей используют имя, которое не принадлежит их родителям, я с некоторым успехом использовал следующую схему:
Полное имя (как обычно пишется для адресации почты); Фамилия; Известный как (имя, обычно используемое в разговоре).
например:
Полное имя: Уильям Гейтс III; Фамилия: Гейтс; Известный как: Билл
Полное имя: Сунг Ли; Фамилия: Сун; Известная как: Лиза
+1. Для приложений у меня обычно есть поля «полное имя» и «ник», которые заполняются независимо. У меня не было варианта использования «фамилии», но YMMV.
+1 - ПОЖАЛУЙСТА, не забывайте, что те из нас, кого благословили наши родители, могут использовать имя, отличное от нашего имени - например, J. Эдгар Гувер ». Юридическое название (и CC, в большинстве случаев) требует 'J. Эдгар Гувер »; Случайный / Псевдоним / Известный - как бы «Эдгар Гувер». Имя, ИМ, Фамилия не годятся.
А у некоторых людей нет «фамилии» или «фамилии», например в некоторых восточноафриканских культурах они используют имя отца и имя деда, например Том Дик Гарри. В некоторых случаях фамилия находится посередине, например. Энсон Мария Элизабет Чан Фонг Онсанг. См. Также статьи Википедии «Исландское имя», «Арабское имя» и «Имена в Российской Империи, Советском Союзе и странах СНГ».
Отличное написание. Спасибо. Я думаю, что сообщение @xeolot о python-nameparser отлично подходит для всего, что вы упомянули.
Я бы указал стандартный формат (некоторые формы их используют), например «Пожалуйста, напишите свое имя в форме Имя Фамилия».
Так вам будет проще, так как в именах обычно нет запятой. Он также проверяет, действительно ли ваши пользователи вводят имя и фамилию.
Золотое правило данных - не собирайте данные слишком рано - гораздо проще склеить поля, чем разделить их. У большинства людей также есть отчество, которое должно быть необязательным полем. У некоторых людей множество отчества. У некоторых есть только одно имя, одно слово. В некоторых культурах обычно есть словарь отчества, который отдает дань уважения генеалогическому древу, восходящему к приземлению Ковчега Голгафринчама.
Здесь вам не нужно кодовое решение - вам нужно бизнес-правило.
Простой способ сделать именно то, что вы просили в python, -
name = "Thomas Winter"
LastName = name.split()[1]
(обратите внимание на скобки при разделении вызова функции.)
split () создает список, в котором каждый элемент взят из исходной строки, разделенный пробелами. Теперь вы можете захватить второй элемент с помощью name.split () [1] или последний элемент с помощью name.split () [- 1]
Однако, как говорили другие, если вы не УВЕРЕНЫ, что получаете строку типа «First_Name Last_Name», возникает гораздо больше проблем.
Если вы ищете только FirstName, это: FirstName = name.split () [0] - Но это то, что я искал (за исключением любого второго имени :)). Спасибо!
Поскольку существует так много разных вариантов того, как люди пишут свои имена, вот как базовый способ получить имя / фамилию с помощью регулярного выражения.
import re
p = re.compile(r'^(\s+)?(Mr(\.)?|Mrs(\.)?)?(?P<FIRST_NAME>.+)(\s+)(?P<LAST_NAME>.+)$', re.IGNORECASE)
m = p.match('Mr. Dingo Bat')
if (m != None):
first_name = m.group('FIRST_NAME')
last_name = m.group('LAST_NAME')
Этот код самый короткий и удобный для случайного использования. Я использую его с Firebase, потому что API Firebase дает мне только полное имя. Одна проблема в том, что он не поддерживает LAST, FIRST. С этим легко справиться, проверив запятую перед применением. Если есть запятая, просто переверните регулярное выражение.
Если вы пытаетесь разобрать человеческое имя в PHP, я рекомендую Скрипт nameparse.php Кейта Бекмана.
И даже если вы не используете PHP, просмотр кода очень поучителен.
Это довольно старая проблема, но я обнаружил, что она ищет решение для разбора частей из общего имени.
http://code.google.com/p/python-nameparser/
Он очень ориентирован на США (например, названия, кажется, охватывают практически все звания в вооруженных силах США), а код использования заглавных букв порождает обычные глупости, такие как MacE, MacK и MacHin :-(
Я думаю, что это отличная библиотека Python, которая полностью решает все проблемы, перечисленные @bevan в его сообщении. Согласен с комментариями JohnMachin о том, что он ориентирован на США, однако это нормально для моего варианта использования. Я начал писать более простую версию python-nameparser, прежде чем прочитал ваш пост. Спасибо.
Это определенно более сложная задача, чем кажется на первый взгляд. Я написал некоторые задачи, а также свой алгоритм их решения в своем блоге. Обязательно ознакомьтесь с моим проектом Google Code, если вам нужна последняя версия на PHP:
Вот как я это делаю в своем приложении:
def get_first_name(fullname):
firstname = ''
try:
firstname = fullname.split()[0]
except Exception as e:
print str(e)
return firstname
def get_last_name(fullname):
lastname = ''
try:
index=0
for part in fullname.split():
if index > 0:
if index > 1:
lastname += ' '
lastname += part
index += 1
except Exception as e:
print str(e)
return lastname
def get_last_word(string):
return string.split()[-1]
print get_first_name('Jim Van Loon')
print get_last_name('Jim Van Loon')
print get_last_word('Jim Van Loon')
Привет. Спасибо за код. Наблюдение: вы можете избавиться от необходимости устанавливать индекс с помощью enumerate - для индекса, части в enumerate (fullname.split ()). Также вы можете избавиться от необходимости использовать условное выражение вокруг + = '', используя join. lastname = '' .join (фамилии)
return " ".join(fullname.split()[1:]) вместо всего, что есть в try...except.
name = "Thomas Winter"
first, last = name.split()
print("First = {first}".format(first=first))
#First = Thomas
print("Last = {last}".format(last = " ".join(last)))
#Last = Winter
Здесь есть некоторые проблемы. Вы используете join() со строкой в качестве аргумента, поэтому в этом примере вы должны напечатать W i n t e r. Другая проблема заключается в том, что код не работает, если у вас есть 3 слова или более в переменной name. Я предполагаю, что вы забыли добавить * в свой распакованный файл, например: first, *last = name.split(), чтобы исправить все проблемы.
Для этого можно использовать str.find().
x=input("enter your name ")
l=x.find(" ")
print("your first name is",x[:l])
print("your last name is",x[l:])
Из отзыва: Добавьте описание к своему ответу, а также отформатируйте его должным образом. См .: ОТВЕЧАТЬ
Вот обязательная статья "Что должен знать каждый программист": kalzumeus.com/2010/06/17/…