如何打印列表中所有元素的首字母?

时间:2019-04-11 19:33:24

标签: python list

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

首先,我将name变量拆分为多个部分。我用名称的最后一部分创建了一个变量调用lname。再一次,我创建了一个名为fname的变量,除了最后一个单词外,其他所有单词都如此。 我试过for循环从fname打印所有首字母。但是,我无法将它们分配给变量,因此我可以将它们与最后一部分连接起来以形成全名。

  class Vehicle{
    constructor(...args){ 
        let arr = Array.from(args)

        this.wheelTotal = arr[0]
        this.energySource = arr[1]
        this.manufacturer = arr[2]
        this.isOn = false
  }

  getSpec(key){
         if(this.hasOwnProperty(key)){
      return this[key]
    }
  }
 }

class Tesla extends Vehicle{
  constructor(...args){
  let arr2 = Array.from(...args)
  super(...args);
              this.milesPerCharge = arr2[0]
      this.model = arr2[1]
      this.chargePercentage = arr2[2]

  }
  minutesToFullCharge(){
      return 100 - this.chargePercentage
  }
}


describe('Tesla', () => {
let teslaCar;

beforeEach(() => {
  teslaCar = new Tesla([300, 'Model S', 50, 100, [[4, 'electric', 'Tesla']]]);    
});

it('should have properties specific to a Tesla such as MPC (miles per charge) and Model', () => {
  expect(teslaCar.milesPerCharge).toBe(300);
  expect(teslaCar.model).toBe('Model S');
  expect(teslaCar.chargePercentage).toBe(50); // 50% charged
  expect(teslaCar.minutesToCharge).toBe(100); // 100 minutes for a full charge
});

it('should have all properties of a Vehicle instance', () => {
  expect(teslaCar.wheelTotal).toBe(4);
  expect(teslaCar.energySource).toBe('electric');
  expect(teslaCar.manufacturer).toBe('Tesla');
  expect(teslaCar.getSpec('wheelTotal')).toBe(4);
});

4 个答案:

答案 0 :(得分:2)

此答案利用高级元组解包(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 :(得分:1)

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

答案 2 :(得分:1)

Yoi可以使用List Comprehension

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

输出:

  

S.O.Flow

参考文献:

  1. List Comprehension
  2. Enumerate
  3. Join

答案 3 :(得分:1)

也许有更多的python方式可以做到这一点,但是对于最小的代码更改,您要做的就是添加到字符串并在循环后将其打印出来。因此,无需打印make smoke,而是将其添加到需要在循环之前实例化的字符串中。然后,您可以在最后打印整个字符串之前为其添加姓氏。即

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>)将它们连接在一起。这意味着联接内的代码正在提供'. '

联接内的代码称为列表理解。它实际上是一个扁平化的for循环,它将for循环的每个结果附加到列表中。 Section 5.1.3 of the python tutorial covers list comprehensions.

除非该字符串的索引(i)等于列表的最后一个索引,否则列表理解将采用名称的首字母。这意味着输入['s', 'o', 'flow']的len()为3。最后一个索引为2(从0开始,从0开始计数=>'Stack',1 =='Over',2 =='Flow') 。一旦索引== 2,它将使用全名而不是第一个字母。

Enumerate为您提供列表中的索引和列表元素,这就是为什么我的Stack Over Flow循环为for而不是for i, n的原因。

不对诸如for n之类的值进行硬编码的优点是用于其他输入。如果一个人没有中间名怎么办?例如。 == 2应该是John Doe。硬编码值为2时,结果将改为J. Doe。或者,如果输入的是玛丽·苏·伊丽莎白·史密斯(Mary Sue Elizabeth Smith),该怎么办?她的结果应该是M. S. E. Smith,但如果您的解决方案中的名称数量是硬编码的,则不会导致该输出。