2012-04-08 35 views
6

Thật lạ lùng, cách hiệu quả nhất để xác định xem chuỗi của 3 ký tự có theo thứ tự liên tiếp không?làm cách nào để kiểm tra xem 3 ký tự có theo thứ tự alpha liên tiếp hay không

Dưới một cách nhanh chóng & cách bẩn dường như hoạt động, các triển khai khác đẹp hơn?

Tôi giả sử một phương pháp thay thế có thể là sắp xếp một bản sao trình tự và so sánh nó với bản gốc. Không, điều đó sẽ không tài khoản cho những khoảng trống trong chuỗi.

(Đây không phải là bài tập về nhà - nghe để NPR Sunday Morning progam sẽ bí quyết)

def checkSequence(n1, n2, n3): 
    """ check for consecutive sequence of 3 """ 
    s = ord('a') 
    e = ord('z') 

# print n1, n2, n3 
    for i in range(s, e+1): 
     if ((n1+1) == n2) and ((n2+1) == n3): 
      return True 

    return False 


def compareSlice(letters): 
    """ grab 3 letters and sent for comparison """ 

    letters = letters.lower() 
    if checkSequence(ord(letters[0]), ord(letters[1]), ord(letters[2])): 
     print '==> seq: %s' % letters 
     return True 

    return False 
+2

Đây có phải là [Lý do] (http://www.npr.org/2012/04/08/150202658/a- mix-up-at-the-music-fest)? – eabraham

+0

Dường như bước tiếp theo là từ điển để kiểm tra. Hãy thử [this] (http://thedatahub.org/dataset/wiktionary/resource/8147edd1-6932-4816-aa88-2fa4fdc60ab5). – eabraham

+0

@eabraham Đóng .. :-) – Levon

Trả lời

11

dễ dàng:

>>> letters = "Cde" 
>>> from string import ascii_lowercase 
>>> letters.lower() in ascii_lowercase 
True 
>>> letters = "Abg" 
>>> letters.lower() in ascii_lowercase 
False 

Ngoài ra, người ta có thể sử dụng string.find().

>>> letters = "lmn" 
>>> ascii_lowercase.find(letters) != -1 
True 

Tôi đoán một hàm sử dụng này sẽ như thế nào:

def checkSequence(*letters): 
    return ''.join(letters).lower() in ascii_lowercase 
+0

Điều này dường như đối với tôi là giải pháp chuyển tiếp và đơn giản nhất, rất hay. – Levon

+0

tra cứu bảng luôn thuận tiện cho kích thước dữ liệu bình thường, tuyệt vời – okm

1

Làm thế nào về một cái gì đó như thế này:

l = letters.lower() 
if len(l)>=3 and ord(l[0])+2==ord(l[1])+1==ord(l[2]): print "yes" 
else: print "no" 
+0

cảm ơn - có vẻ rất giống với cách tiếp cận của tôi. – Levon

5

Đây là một cách pythonic thoải mái để kiểm tra cho tùy tiện chuỗi dài các ký tự:

def consecutive_chars(l): 
    return all(ord(l[i+1])-ord(l[i]) == 1 for i in range(len(l)-1)) 
+0

Đã chỉnh sửa để xóa các dấu ngoặc vuông để làm cho 'all' lặp lại trên một trình tạo, thay vì tạo toàn bộ danh sách' True 'và' False 'trước. – Acorn

+0

gọn gàng .. vì lý do nào đó tôi đã không gặp chức năng all() tích hợp trước – Levon

+0

@Acom - cảm ơn bạn đã sửa chữa. –

4
ord('a') < ord(a)+1 == ord(b) == ord(c)-1 < ord('z') 
+0

+1 Rất thú vị! Và câu trả lời duy nhất ở đây là đúng. Tất cả những người khác bỏ lỡ kiểm tra chữ cái. –

+0

cool - nhờ giải pháp – Levon

+0

@MarkByers Vâng, đó là =), mặc dù không gian giải pháp ở đây bị hạn chế và tìm kiếm trực tiếp dễ dàng hơn – okm

4

Điều này có thể chỉ cần thực hiện như

>>> x=['a','b','c'] 
>>> y=['a','c','b'] 
>>> z=['c','b','a'] 
>>> x==sorted(x) or x == sorted(x,reverse=True) 
True 
>>> y==sorted(x) or y == sorted(y,reverse=True) 
False 
>>> z==sorted(x) or z == sorted(z,reverse=True) 
True 
>>> 

suy nghĩ theo cách này. Chữ cái liên tiếp iff chúng được sắp xếp hoặc tăng dần hoặc giảm dần.

Như đã chỉ ra trong các bình luận như thế này sẽ không hoạt động nếu chuỗi chứa lỗ, cách tiếp cận khác sẽ

>>> ''.join(x).lower() in string.lowercase 
True 
>>> 
+1

Cách tiếp cận này đã được đề cập trong câu hỏi và, như OP chỉ ra, nó không hoạt động. –

+0

@MarkByers: Tôi đã cập nhật câu trả lời của tôi với một giải pháp có thể khác – Abhijit

+0

Mặc dù vậy vẫn là sai. 'ace' cho' True'. Và bạn nên sử dụng '//' not '/'. Nếu không có thay đổi đó, mã của bạn sẽ đưa ra một lỗi trong Python 3. –

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