Đố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.
lỗi là gì? –
Lỗi là nó trả về 0 –
'len (word.replace (" "," "))' – Blorgbeard