2017-08-13 15 views
5

Đây là những gì tôi có cho đến nay:Xác định bảng chữ cái để bất kỳ chuỗi thư cho rồi sau đó sử dụng để kiểm tra xem một từ có một số tiền nhất định của nhân vật

alphabet = "a" or "b" or "c" or "d" or "e" or "f" or \ 
      "g" or "h" or "i" or "j" or "k" or "l" or \ 
      "m" or "n" or "o" or "p" or "q" or "r" or \ 
      "s" or "t" or "u" or "v" or "w" or "x" or \ 
      "y" or "z" 

letter_word_3 = any(alphabet + alphabet + alphabet) 

print("Testing: ice") 

if "ice" == letter_word_3: 

    print("Worked!") 

else: 

    print("Didn't work") 

print(letter_word_3) # just to see 

Tôi muốn để có thể cuối cùng quét một tài liệu và chọn ra 3 chữ cái nhưng tôi không thể làm cho phần này hoạt động được. Tôi mới để viết mã nói chung và python là ngôn ngữ đầu tiên tôi đã học được vì vậy tôi có thể làm cho một sai lầm lớn ngu ngốc.

+5

Bạn đã thử in biến 'bảng chữ cái' chưa? – klutt

+0

@klutt có, và nó luôn luôn chỉ in "a". Tôi khá chắc chắn với python nếu bạn có một tuyên bố 'hoặc', nó sẽ luôn luôn chỉ làm đầu tiên 'hoặc' nếu đưa ra tùy chọn. Tôi muốn có thể quét qua toàn bộ bảng chữ cái để xem nó có thể tìm thấy một bức thư hay không, và nếu có, hãy xem nó có thể tìm thấy một chữ cái khác trong bảng chữ cái bên cạnh nó không, và sau đó thêm một lần nữa để tìm một từ 3 chữ cái . –

Trả lời

0
words = [word for word in line.split() if len(word) == 3 and all(ch in ascii_lowercase for ch in word)] 
5

Bạn đã có một số ý tưởng tốt, nhưng mà loại thành phần của chức năng thực sự là dành cho ngôn ngữ chức năng (ví dụ cú pháp như thế này sẽ làm việc tốt trong Haskell!)

Trong Python, "a" or "b" or ... đánh giá để chỉ một giá trị , nó không phải là một chức năng như bạn đang cố gắng sử dụng nó. Tất cả các giá trị đều có "sự thật" đối với chúng. Tất cả các chuỗi đều "trung thực" nếu chúng không trống (ví dụ: bool("a") == True, nhưng bool("") == False). or không thay đổi bất cứ điều gì ở đây, vì giá trị đầu tiên là "truthy", do đó alphabet đánh giá để True (cụ thể hơn để "a".

letter_word_3 sau đó cố gắng để làm any("a" + "a" + "a"), mà luôn luôn là True (kể từ "a" là truthy)


bạn nên làm gì thay vì là theo chiều dài kiểm tra mỗi từ, sau đó kiểm tra từng chữ cái để chắc chắn rằng nó ở "abcdefghijklmnopqrtuvwxyz". Chờ một thứ hai, bạn đã chú ý đến lỗi tôi vừa giới thiệu? đọc chuỗi đó một lần nữa. tôi quên an "s" và do đó bạn có thể! May mắn là stdlib của Python có chuỗi này ở đâu đó tiện dụng cho bạn.

from string import ascii_lowercase # a-z lowercase. 

def is_three_letter_word(word): 
    if len(word) == 3: 
     if all(ch in ascii_lowercase for ch in word): 
      return True 
    return False 

# or more concisely: 
# def is_three_letter_word(word): 
#  return len(word) == 3 and all(ch in ascii_lowercase for ch in word) 
3

Hợp lý hơn là letter_word_3 là hàm và không phải là biến. Đây là cách bạn có thể thực hiện letter_word_3 và sử dụng nó trong mã của bạn:

alphabet = 'abcdefghijklmnopqrstuvwxyz' 

def letter_word_3(word): 
    return len(word) == 3 and all(x in alphabet for x in word) 

print("Testing: ice") 

if letter_word_3("ice"): 
    print("Worked!") 
else: 
    print("Didn't work") 

Tôi đã gỡ bỏ dòng cuối cùng in letter_word_3 bởi vì nó sẽ không làm cho nhiều ý nghĩa để in các đối tượng chức năng.

Ban đầu, tôi sai giả định rằng mã của bạn phải tạo ra tất cả các chuỗi 3 chữ và kiểm tra xem "đá" là trong số những, và cố định nó như sau:

alphabet = "abcdefghijklmnopqrstuvwxyz" 

letter_word_3 = [a+b+c for a in alphabet for b in alphabet for c in alphabet] 

print("Testing: ice") 

if "ice" in letter_word_3: # it will search amongst 17000+ strings! 
    print("Worked!") 
else: 
    print("Didn't work") 

print(letter_word_3) # it will print 17000+ strings! 

này là tất nhiên rất không hiệu quả, do đó, không làm điều đó. Nhưng vì nó đã được thảo luận, tôi sẽ để nó ở đây.

Một số điều hữu ích mà bạn nên biết về Python:

  • chuỗi là chuỗi, vì vậy họ có thể được lặp (từng ký tự)
  • một nhân vật là một chuỗi tự
  • x in sequence lợi nhuận True nếu x được chứa trong sequence
  • a or b đánh giá là a nếu a đánh giá là True, nếu không nó đánh giá để b
  • một (không rỗng) chuỗi đánh giá để True
  • hai chuỗi có thể được nối với +

Tuy nhiên, tôi khuyên bạn nên đọc một giới thiệu tốt về ngôn ngữ Python.

+1

Lưu ý rằng 'letter_word_3' trở nên rất dài, và sau đó kiểm tra nó cho các thành viên hơn và hơn nữa trở nên khá tốn kém! (Tôi biết * bạn * biết điều này, nhưng đối với OP ...) –

+0

Vâng, giải pháp này quy mô rất kém. Kích thước của 'letter_word_n' sẽ là n! vì vậy nó là khá nhiều không thể sử dụng giải pháp này cho n> 13. – klutt

+0

Bạn nói đúng, tôi hiểu sai những gì OP muốn làm. Tôi thêm một giải pháp thứ hai trên đầu trang mà là hợp lý hơn, nhưng để lại một cũ để tham khảo. – fferri

5

Có một vài điều sai. Trước hết, alphabetluôn luôn được đánh giá là "a".

or trong tuyên bố chỉ có nghĩa là "nếu điều trước đó là sai, hãy sử dụng thay thế này". Kể từ khi "a" là sự thật, nó dừng lại ở đó. Phần còn lại của bức thư thậm chí không được Python nhìn.

Tiếp theo là any. any chỉ cần kiểm tra xem có điều gì trong một số iterable không. alphabet + alphabet + alphabet đang được đánh giá là "aaa", vì vậy letter_word_3 luôn trả về True.

Khi bạn kiểm tra xem "ice" == letter_word_3 'nó đang được đánh giá là "ice" == True.

Để kiểm tra xem một từ tùy ý là ba chữ cái, cách dễ nhất là sử dụng như sau:

import re 
def is_three_letters(word): 
    return bool(re.match(r"[a-zA-Z]{3}$", word)) 

Sau đó, bạn có thể sử dụng

is_three_letters("ice") # True 
is_three_letters("ICE") # True 
is_three_letters("four") # False 
is_three_letters("to") # False 
is_three_letters("111") # False (numbers not allowed) 

Để cũng cho phép con số, sử dụng

import re 
def is_three_letters(word): 
    return bool(re.match(r"[a-zA-Z\d]{3}$", word)) 

Điều đó sẽ cho phép các nội dung như "h2o" cũng được coi là từ ba chữ cái.

EDIT:

import re 
def is_three_letters(word): 
    return bool(re.match(r"[a-z]{3}$", word)) 

Đoạn mã trên sẽ chỉ cho phép chữ cái thường (không có số hoặc vốn).

import re 
def is_three_letters(word): 
    return bool(re.match(r"[a-z\d]{3}$", word)) 

Điều đó sẽ chỉ cho phép chữ thường và số (không có thủ đô).

EDIT:

Để kiểm tra các n lượng chữ cái, chỉ cần thay đổi "{3}" để bất cứ điều gì bạn muốn dài trong chuỗi trong đoạn code trên. ví dụ.

import re 
def is_eight_letters(word): 
    return bool(re.match(r"[a-zA-Z\d]{8}$", word)) 

Ở trên sẽ tìm kiếm các từ dài tám cho phép thủ đô, chữ thường và số.

+0

N.B. rằng '[a-zA-Z]' sẽ cho phép chữ hoa –

+0

Cố định cho tất cả các trường hợp ngay bây giờ. @Adam Smith – ChristianFigueroa

3

Việc thực hiện đơn giản nhất của việc này là để sử dụng chức năng sau:

def is_three_letter_word(word): 
    return len(word) == 3 and word.isalpha() 

Vì vậy, ví dụ:

>>> is_three_letters("ice") # True 
True 
>>> is_three_letters("ICE") # True 
True 
>>> is_three_letters("four") # False 
False 
>>> is_three_letters("to") # False 
False 
>>> is_three_letters("111") # False (numbers not allowed) 
False 

Sử dụng all là tốt, nhưng sẽ không được nhanh hơn bằng cách sử dụng xây dựng -in phương pháp chuỗi. Ngoài ra, bạn không nên sáng tạo lại bánh xe. Nếu ngôn ngữ cung cấp một phương pháp thích hợp, bạn nên sử dụng nó.

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