2013-08-27 91 views
13

Đây là giải pháp của tôi dẫn đến lỗi. Returns 0Làm thế nào để đếm số lượng chữ cái trong một chuỗi không có dấu cách?

PS: tôi vẫn muốn yêu một sửa chữa để mã của tôi :)

from collections import Counter 
import string 


def count_letters(word): 
    global count 
    wordsList = string.split(word) 
    count = Counter() 
    for words in wordsList: 
     for letters in set(words): 
      return count[letters] 

word = "The grey old fox is an idiot" 
print count_letters(word) 
+1

lỗi là gì? –

+0

Lỗi là nó trả về 0 –

+6

'len (word.replace (" "," "))' – Blorgbeard

Trả lời

20
def count_letters(word): 
    return len(word) - word.count(' ') 

Ngoài ra, nếu bạn có nhiều chữ để bỏ qua, bạn có thể lọc các chuỗi:

def count_letters(word): 
    BAD_LETTERS = " " 
    return len([letter for letter in word if letter not in BAD_LETTERS]) 
+0

Cảm ơn Matt. bạn có thể vui lòng chỉ cho tôi lời giải thích của word.count trong Python Documents, một liên kết có lẽ? –

+1

http://docs.python.org/2/library/stdtypes.html#string-methods –

+0

Cảm ơn Matt, nó không nói về việc sử dụng này ''. Bạn có thể khai sáng cho chúng tôi nhiều hơn về cách thức hoạt động, chúng tôi có thể làm gì khác với nó. –

6

Câu trả lời của MattBryant là câu trả lời hay nhất, nhưng nếu bạn muốn loại trừ nhiều loại chữ hơn là chỉ khoảng trắng, nó sẽ trở nên khó xử. Dưới đây là một biến thể của mã hiện tại của bạn sử dụng Counter rằng sẽ làm việc: Sản lượng

from collections import Counter 
import string 

def count_letters(word, valid_letters=string.ascii_letters): 
    count = Counter(word) # this counts all the letters, including invalid ones 
    return sum(count[letter] for letter in valid_letters) # add up valid letters 

Ví dụ:

>>> count_letters("The grey old fox is an idiot.") # the period will be ignored 
22 
+0

Nếu bạn thay thế BAD_LETTERS = "" bằng BAD_LETTERS = ["", "."], Mã của anh ấy sẽ hoạt động giống như của bạn. –

+1

@AnonymousPi: Câu trả lời được chấp nhận đã được chỉnh sửa ba phút sau khi tôi tăng lên. Vào thời điểm tôi viết câu trả lời này, chỉ có phần 'len (word) - word.count (" ")' ở đó, đó là những gì tôi nghĩ sẽ khó xử để mở rộng. Phần mở rộng ngây thơ để loại trừ nhiều loại ký tự, 'len (word) - sum (word.count (letter) cho chữ cái trong BAD_LETTERS)' sẽ rất chậm (đó là lý do tại sao MattBryant không đề xuất nó!). – Blckknght

+0

Chỉ muốn nói với bạn ... –

10

Đơn giản chỉ cần giải pháp sử dụng các sum chức năng:

sum(c != ' ' for c in word) 

Đó là một giải pháp hiệu quả bộ nhớ vì nó sử dụng một generator thay vì tạo danh sách tạm thời và sau đó tính tổng của nó.

Đó là giá trị đề cập rằng c != ' ' lợi nhuận True or False, đó là một giá trị kiểu bool, nhưng bool là một subtype của int, vì vậy bạn có thể tổng hợp các giá trị bool (True tương ứng với 1False tương ứng với 0)

bạn có thể kiểm tra một inheretance bằng cách sử dụng phương pháp mro:

>>> bool.mro() # Method Resolution Order 
[<type 'bool'>, <type 'int'>, <type 'object'>] 

Ở đây bạn thấy rằng bool là loại phụ của int là loại phụ của object.

+2

Ở đây nó đáng để chỉ ra rằng, khi được sử dụng trong các ngữ cảnh số, 'True' và' False' hoạt động giống như các số nguyên '1' và' 0'. Nó không thể được rõ ràng. – Paolo

+0

@Guandalino Điểm tốt, tôi vừa chỉnh sửa câu trả lời. – pkacprzak

3

OK, nếu đó là những gì bạn muốn, đây là những gì tôi sẽ làm gì để sửa chữa mã hiện tại của bạn:

from collections import Counter 

def count_letters(words): 
    counter = Counter() 
    for word in words.split(): 
     counter.update(word) 
    return sum(counter.itervalues()) 

words = "The grey old fox is an idiot" 
print count_letters(words) # 22 

Nếu bạn không muốn đếm số ký tự không phải khoảng trắng, sau đó bạn sẽ cần phải loại bỏ chúng - bên trong vòng lặp for nếu không sớm hơn.

3

Đối với một giải pháp một liner:

def count_letters(word): return len(filter(lambda x: x not in " ", word)) 

này hoạt động bằng cách sử dụng chức năng lọc, cho phép bạn chọn các yếu tố của một danh sách đó trở thành sự thật khi truyền cho một hàm boolean giá trị mà bạn vượt qua như đối số đầu tiên. Tôi đang sử dụng một hàm lambda để thực hiện một chức năng nhanh chóng, throwaway cho mục đích đó.

>>> count_letters("This is a test") 
11 

Bạn có thể dễ dàng mở rộng này để loại trừ bất kỳ lựa chọn các ký tự mà bạn thích:

def count_letters(word, exclude): return len(filter(lambda x: x not in exclude, word)) 

>>> count_letters ("This is a test", "aeiou ") 
7 

Edit: Tuy nhiên, bạn muốn để có được mã của riêng bạn để làm việc, vì vậy đây là một vài suy nghĩ. Vấn đề đầu tiên là bạn không thiết lập một danh sách cho đối tượng Counter để đếm. Tuy nhiên, vì bạn đang tìm kiếm tổng số chữ cái, bạn cần phải tham gia các từ lại với nhau một lần nữa thay vì đếm từng từ riêng lẻ. Việc lặp lại để tăng số lượng của mỗi chữ cái là không thực sự cần thiết vì bạn có thể kéo danh sách các giá trị và sử dụng "tổng hợp" để thêm chúng.

Dưới đây là một phiên bản đó là càng gần với mã của bạn như tôi có thể làm cho nó, nếu không có sự lặp:

from collections import Counter 
import string 

def count_letters(word): 
    wordsList = string.split(word) 
    count = Counter("".join(wordsList)) 
    return sum(dict(count).values()) 

word = "The grey old fox is an idiot" 
print count_letters(word) 

Edit: Để đối phó với một lời nhận xét hỏi tại sao không sử dụng một vòng lặp for, đó là vì nó không phải cần thiết và trong nhiều trường hợp, sử dụng nhiều cách ngầm để thực hiện các tác vụ lặp lại trong Python có thể nhanh hơn, dễ đọc hơn và hiệu quả hơn về bộ nhớ.

Ví dụ, tôi có thể viết

joined_words = [] 
for curr_word in wordsList: 
    joined_words.extend(curr_word) 
count = Counter(joined_words) 

nhưng trong việc này tôi gió lên phân bổ một mảng phụ và thực hiện một vòng lặp thông qua người phiên dịch Python rằng giải pháp của tôi:

count = Counter("".join(wordsList)) 

sẽ thực hiện trong một đoạn mã C được biên dịch tối ưu. Giải pháp của tôi không phải là cách duy nhất để đơn giản hóa vòng lặp đó, nhưng đó là một cách.

+0

Rất vui được thấy bạn không sử dụng vòng lặp, nhưng tại sao? –

+0

Lý do chính không sử dụng vòng lặp là không cần thiết. Python cung cấp nhiều cách để thực hiện các nhiệm vụ lặp đi lặp lại một cách ngầm định, và các kỹ thuật này thường nhanh hơn. Tôi sẽ chỉnh sửa câu trả lời của tôi để giải thích một chút. –

2

tôi quản lý để ngưng tụ nó thành hai dòng mã:

string = input("Enter your string\n") 
print(len(string) - string.count(" ")) 
0

Tôi thấy điều này đang làm việc một cách hoàn hảo

str = "count a character occurance" 
str = str.replace(' ', '') 
print (str) 
print (len(str)) 
2

Đếm số ký tự trong một chuỗi sử dụng regex.

import re 
s = 'The grey old fox is an idiot' 
count = len(re.findall('[a-zA-Z]',s)) 
0
def count_letter(string): 
    count = 0 
    for i in range(len(string)): 
     if string[i].isalpha(): 
      count += 1 
    return count 


print(count_letter('The grey old fox is an idiot.')) 
-3

Hãy thử sử dụng ...

resp = input("Hello, I am stuck in doors! What is the weather outside?") 
print("You answered in", resp.ascii_letters, "letters!") 

Không làm việc cho tôi, nhưng nên làm việc cho một số kẻ ngẫu nhiên.

+0

Điều này không hoạt động. Đối tượng 'resp' sẽ không có thuộc tính' ascii_letters'. Và quan trọng hơn, không trả lời câu hỏi được hỏi – RandomGuy

0
n=str(input("Enter word: ").replace(" ","")) 

ans=0 
for i in n: 
    ans=ans+1 
print(ans)  
0
word_display = "" 
for letter in word: 
    if letter in known: 
     word_display = "%s%s " % (word_display, letter) 
    else: 
     word_display = "%s_ " % word_display 
return word_display 
+0

Các câu trả lời chỉ có mã không được khuyến khích. Vui lòng mô tả cách thức hoạt động và/hoặc những gì khác với câu hỏi OP. – lit

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