2017-02-26 720 views
0

我正在尝试编写一个基本的密码检查程序,并且每当用户使用两次尝试输入正确的密码时,我都应该打印一个关于它们中有多少个字母的提示密码。 密码是可变的,我存储在正确的字符串。Python:计算字符串中有多少个字母

elif attempts == 1: 
     letters = 0 
     for i in password: 
      if password[i].isaplha(): 
       letters = letters + 1 
     print('There are',letters,'letters in your password') 

我的代码提供了错误

TypeErrorTraceback (most recent call last) 
<ipython-input-195-c967c81bda5f> in <module>() 
     letters = 0 
     for i in password: 
---->  if password[i].isaplha(): 
       letters = letters + 1 
TypeError: string indices must be integers 

我在做什么错?

+0

为什么你觉得有什么不对呢?给一个[mcve]我们实际上可以测试一个输入,预期和实际输出。 – jonrsharpe

+1

[字符串中的字母数]可能的重复(http://stackoverflow.com/questions/2932511/letter-count-on-a-string) – bc004346

回答

3

这里有两个问题。

  • for i in password被遍历实际字符password而不是他们的指数,所以你应该检查i.isalpha()
  • 字符串方法不是isaplha,它是isalpha

修复这些,同时保持当前的做法,

... 
elif attempts == 1: 
    letters = 0 
    for i in password: 
     if i.isalpha(): 
      letters = letters + 1 
    print('There are',letters,'letters in your password') 

,如果你想更简明地做到了一点,你可以sum根据是否每个字符isalpha与否布尔值的生成,使用在Python中,True1

... 
elif attempts == 1: 
    letters = sum(i.isalpha() for i in password) 
    print('There are {0} letters in your password'.format(letters)) 
0

IsAplha()方法返回true,如果你在你的字符串只有字母,它并没有告诉字符串的长度,你可以做到这一点像 打印(“你”,LEN(密码) ,'密码中的字母')

+0

OP不希望字符串的长度,但数字*信件*在它里面。 –

0

你也可以使用正则表达式来实现这一点。

import re 
password = 'hE1Ar' 
lett_count = len(re.findall('[A-z]', password)) 

更新/更正:

lett_count = len(re.findall('[A-Za-z]', password)) 
+0

试试'password ='you_fail''。 –

+0

哎呀,看看更新! –

相关问题