【问题标题】:How to print the first letter from all elements in a list?如何打印列表中所有元素的第一个字母?
【发布时间】:2019-04-12 20:28:58
【问题描述】:

首先,我想将用户输入保存到一个名为“名称”的变量中。然后,我想按原样打印名称的最后一个单词,但对于该名称的所有其他单词,我只想以大写字母打印世界的第一个字母。 假设,name =“堆栈溢出” 我想让它成为 S. O. Flow。

首先,我拆分名称变量以分隔各个部分。我用名称的最后一部分创建了一个名为 lname 的变量。然后,我创建了一个名为 fname 的变量,其中包含除最后一个单词之外的所有其他单词。 我尝试使用 for 循环打印 fname 中的所有首字母。但是,我不能将它们分配给变量,以便我可以将它们与最后一部分连接起来以形成全名。

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

【问题讨论】:

    标签: python list


    【解决方案1】:

    这个答案利用了高级元组解包 (Python3) 和 f-strings (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)
    

    【讨论】:

      【解决方案2】:

      也许有更多的pythonic方法可以做到这一点,但对于最小的代码更改,您需要做的就是添加到一个字符串并在循环后打印它。因此,不是打印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 循环的每个结果附加到一个列表中。 Section 5.1.3 of the python tutorial covers list comprehensions.

      除非该字符串的索引 (i) 等于列表的最后一个索引,否则该列表推导式采用名称的第一个字母。这意味着输入Stack Over Flow len() 为 3。最后一个索引为 2(从 0 开始计数 --> 0=='Stack', 1=='Over', 2=='Flow')。一旦索引 == 2,它会使用整个名称而不是第一个字母。

      Enumerate 为您提供了它在列表中的索引和列表的元素,这就是为什么我的for 循环是for i, n 而不仅仅是for n

      不对值进行硬编码(例如 == 2)的优势在于其他输入。如果一个人没有中间名怎么办?例如。 John Doe 应该是 J. Doe。如果硬编码值为 2,则结果将改为 J. D.。或者如果输入的是玛丽苏伊丽莎白史密斯怎么办?她的结果应该是 M. S. E. Smith,但如果名称的数量在您的解决方案中是硬编码的,则不会产生该输出。

      【讨论】:

        【解决方案3】:

        Yoi 可以使用List Comprehension:

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

        输出:

        S.O.流

        参考资料:

        1. List Comprehension
        2. Enumerate
        3. Join

        【讨论】:

          【解决方案4】:
          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

          【讨论】:

          • @Uchchash TR 如果对你有帮助,请标记答案
          • res = "{} {}".format(" ".join(first_letters), last_word) ,你能解释一下这行吗?
          • @UchchashTR 你是什么意思?
          • {}{} 的用途是什么?
          • @andreihondrari:我真的认为您应该将words[:len(words) - 1] 替换为更多更pythonic的words[:-1](同样,words[len(words) - 1]words[-1]
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-05-05
          • 1970-01-01
          • 2021-04-04
          • 2021-12-03
          • 2016-12-28
          • 2023-03-19
          • 1970-01-01
          相关资源
          最近更新 更多