Как напечатать первую букву из всех элементов списка? - PullRequest
2 голосов
/ 11 апреля 2019

Прежде всего, я хочу сохранить пользовательский ввод в переменную с именем "name". Затем я хочу напечатать последнее слово имени, как оно есть, но для всех других слов имени я хочу напечатать только первую букву мира заглавной буквой. Предположим, name = "Stack Over Flow" Я хочу сделать это S. O. Flow.

Прежде всего, я разделил переменную имени, чтобы разделить части. Я создал переменную вызова lname с последней частью имени. Затем я создал переменную fname со всеми другими словами, кроме последнего. Я попытался цикл для печати всех первых букв из имени. Но я не могу присвоить их переменной, чтобы я мог соединить их с последней частью, чтобы сделать полное имя.

name=input()
name=name.split(' ')
lname = name[-1]
fname= name[:-1]
for z in fname:
    print(z[0]

Ответы [ 4 ]

2 голосов
/ 11 апреля 2019

Этот ответ использует преимущества расширенной распаковки кортежей (Python3) и f-строк (Python3.6)

name = "Stack Over Flow"

*first_words, last_word = name.split(" ")
first_letters = ' '.join([f"{w[0].upper()}." for w in first_words])

res = f"{first_letters} {last_word}"

print(res)
1 голос
/ 11 апреля 2019

Йой может использовать Понимание списка :

name = "Stack Over Flow"
'.'.join([x[0] if i < 2 else x  for i, x in  enumerate(name.split())])

Выход:

S.O.Flow

Ссылки:

  1. Понимание списка
  2. Перечислите
  3. Регистрация
1 голос
/ 11 апреля 2019

Возможно, есть и более питонские способы сделать это, но для минимального изменения кода все, что вам нужно сделать, это добавить строку и напечатать ее после зацикливания.Таким образом, вместо вывода z[0] вы бы добавили его в строку, которую нужно было бы создать до цикла.Затем вы можете добавить к нему фамилию, прежде чем напечатать всю строку.то есть

name=input()
name=name.split(' ')
lname = name[-1]
fname= name[:-1]
result = ""
for z in fname:
    result = result + z[0] + ". "
result = result + lname
print(result)

Вместо этого я бы сделал следующее:

name=input()
name=name.split(' ')
print('. '.join([n[0] if i != len(name) - 1 else n for i, n in enumerate(name)]))

, что дало Stack Over Flow возвращает S. O. Flow

Это не заглавные буквы для вас,поэтому, если указано stack over flow, будет возвращено s. o. flow.

Чтобы разбить предоставленный мною код, '. '.join(<list>) берет список строк и объединяет их вместе, используя строку '. '.Это означает, что код внутри объединения предоставляет ['s', 'o', 'flow'].

Код внутри объединения называется списком.Это фактически плоский цикл for, который добавляет каждый результат цикла for в список. Раздел 5.1.3 учебника по питону охватывает списочные понимания.

Это понимание списка принимает первую букву имени, если только индекс (i) этой строки не равен последнему индексусписок.Это означает, что при вводе Stack Over Flow len () равно 3. Последний индекс равен 2 (считая от 0 -> 0 == 'Stack', 1 == 'Over', 2 == 'Flow').Как только индекс == 2, он берет полное имя вместо первой буквы.

Перечисление дает вам и его индекс в списке, и элемент списка, поэтому мой *Цикл 1030 * равен for i, n, а не просто for n.

Преимущество в том, что нет жесткого кодирования значения, такого как: == 2, для других входов.Что делать, если у человека нет отчества?Например, John Doe должно быть J. Doe.При жестко заданном значении 2 результат будет J. D..Или что, если вход был для Мэри Сью Элизабет Смит?Ее результатом должен быть MSE Smith, но он не приведет к такому выводу, если количество имен жестко закодировано в вашем решении.

1 голос
/ 11 апреля 2019
name = "Stack Over Flow"

words = name.split(" ")
first_words = words[:-1]
last_word = words[-1]

first_letters = [x[0] + "." for x in first_words]

res = "{} {}".format(" ".join(first_letters), last_word)
print(res)

даст S. O. Flow

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...