2010-05-28 30 views
11

Python newb tại đây. Tôi cố gắng đếm số chữ cái "a" trong một chuỗi đã cho. Mã dưới đây. Nó giữ lại 1 thay vì 3 trong chuỗi "chuối". Bất kỳ đầu vào nào được đánh giá cao.Đếm thư trên một chuỗi

def count_letters(word, char): 
    count = 0 
    while count <= len(word): 
     for char in word: 
      if char == word[count]: 
       count += 1 
      return count 



print count_letters('banana','a') 
+0

Tôi nghĩ rằng mã của bạn là thụt vào đúng. Bạn sẽ nhận được một lỗi thụt đầu dòng. – Lucas

Trả lời

26

Các câu trả lời khác cho thấy điều gì sai với mã của bạn. Nhưng cũng có một cách tích hợp để làm điều này, nếu bạn đang không chỉ làm điều này cho một bài tập:

>>> 'banana'.count('a') 
3 

Danben cho phiên bản này khắc phục:

def count_letters(word, char): 
    count = 0 
    for c in word: 
    if char == c: 
     count += 1 
    return count 

Dưới đây là một số những cách khác để làm điều đó, hy vọng họ sẽ dạy bạn nhiều hơn về Python!

Tương tự, nhưng ngắn hơn for vòng lặp. Khai thác thực tế là các phép toán luận có thể biến thành 1 nếu đúng và 0 nếu sai:

def count_letters(word, char): 
    count = 0 
    for c in word: 
    count += (char == c) 
    return count 

ngắn cho vòng chung có thể được biến thành comprehensions danh sách/máy phát điện.Điều này tạo ra một danh sách các số nguyên tương ứng với từng chữ cái, với 0 nếu những bức thư không phù hợp char và 1 nếu có, và sau đó tóm tắt chúng:

def count_letters(word, char): 
    return sum(char == c for c in word) 

Người tiếp theo lọc ra tất cả các nhân vật mà don' t trận đấu char, và số lượng bao nhiêu còn lại:

def count_letters(word, char): 
    return len([c for c in word if c == char]) 
+0

Cảm ơn bạn nhưng yeah tôi đang cố gắng để có được đầu của tôi xung quanh khái niệm. – shaytac

+2

bạn không cần 'int()' xung quanh giá trị boolean trong Python: 'True == 1 và False == 0' http://ideone.com/k4QLc http://ideone.com/5dHkK – jfs

+0

@ J.F. Sebastian: rất thú vị! không bao giờ biết điều đó. chỉnh sửa để phản ánh rằng – Claudiu

6

return của bạn là của bạn! Hãy cẩn thận với thụt đầu dòng, bạn muốn dòng return count nằm ngoài vòng lặp. Vì vòng lặp for đi qua tất cả các ký tự trong word, vòng lặp ngoài trong khi hoàn toàn không cần thiết.

Một phiên bản làm sạch-up:

def count_letters(word, to_find): 
    count = 0 
    for char in word: 
     if char == to_find: 
      count += 1 
    return count 
+0

cảm ơn rất nhiều điều này đã làm nó. – shaytac

11

Một vấn đề là bạn đang sử dụng count để chỉ cả đến vị trí trong từ mà bạn đang kiểm tra, và số lượng char bạn đã thấy, và bạn đang sử dụng char để tham chiếu cả ký tự nhập bạn đang kiểm tra và ký tự hiện tại trong chuỗi. Sử dụng các biến riêng biệt để thay thế.

Ngoài ra, hãy di chuyển câu lệnh return ra ngoài vòng lặp; nếu không bạn sẽ luôn quay trở lại sau khi kiểm tra ký tự đầu tiên.

Cuối cùng, bạn chỉ cần một vòng lặp để lặp qua chuỗi. Loại bỏ vòng lặp bên ngoài while và bạn sẽ không cần theo dõi vị trí trong chuỗi.

Lấy các đề xuất này, mã của bạn sẽ trông như thế này:

def count_letters(word, char): 
    count = 0 
    for c in word: 
    if char == c: 
     count += 1 
    return count 
3

tôi nhìn thấy một vài điều sai trái.

  1. Bạn sử dụng lại số nhận dạng char, để điều này sẽ gây ra sự cố.
  2. Bạn đang nói if char == word[count] thay vì word[some index]
  3. Bạn quay lại sau lần lặp đầu tiên của vòng lặp!

Bạn thậm chí không cần số while. Nếu bạn đổi tên thông số char thành search,

for char in word: 
    if char == search: 
     count += 1 
return count 
2

Ngoài ra Bạn có thể sử dụng:

mystring = 'banana' 
number = mystring.count('a') 
3

Bạn có một số vấn đề:

  • Có vấn đề với sự thụt lề của bạn như những người khác đã được chỉ ra.
  • Không cần phải có vòng lặp lồng nhau. Chỉ một vòng lặp là đủ.
  • Bạn đang sử dụng char để có nghĩa là hai thứ khác nhau, nhưng biến char trong vòng lặp for sẽ ghi đè dữ liệu từ tham số.

Mã này sửa chữa tất cả các lỗi này:

def count_letters(word, char): 
    count = 0 
    for c in word: 
     if char == c: 
      count += 1 
    return count 

Một nhiều súc tích hơn cách viết này là sử dụng một biểu thức máy phát điện:

def count_letters(word, char): 
    return sum(char == c for c in word) 

Hoặc chỉ cần sử dụng được xây dựng trong phương pháp count mà thực hiện điều này cho bạn:

print 'abcbac'.count('c') 
0
def count_letter(word, char): 
    count = 0 
    for char in word: 
     if char == word: 
      count += 1 
    return count  #Your return is inside your for loop 
r = count_word("banana", "a") 
print r 
0
x=str(input("insert string")) 
c=0 
for i in x: 
    if 'a' in i: 
     c=c+1 
print(c)   
+0

Vui lòng giải thích cách mã của bạn trả lời câu hỏi. –

1
count_letters="" 

number=count_letters.count("") 

print number 
6

Một cách đơn giản như sau:

def count_letters(word, char): 
    return word.count(char) 

Hoặc, có một cách khác đếm từng phần tử trực tiếp:

from collections import Counter 
Counter('banana') 

Tất nhiên, bạn có thể chỉ định một phần tử, ví dụ:

Counter('banana')['a'] 
-2

từ = input ("Nhập một từ: ")

print (" \ nHere của mỗi chữ cái trong văn bản của bạn:") về lá thư Bằng chữ: in (thư)

đầu vào ("\ n \ nNhấn phím enter để thoát.")

0

"banana".count("ana") trả về 1 thay vì 2!

Tôi nghĩ rằng phương thức lặp qua chuỗi (hoặc danh sách) với một bước bằng với chiều dài của chuỗi con để nó không thấy loại nội dung này.

Vì vậy, nếu bạn muốn có một "đầy đủ đếm" bạn phải thực hiện truy cập của riêng bạn với các vòng lặp đúng bước 1

Đúng tôi nếu tôi sai ...

Các vấn đề liên quan