也许有更多的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,但如果名称的数量在您的解决方案中是硬编码的,则不会产生该输出。