Hướng dẫn python string contains set of characters - chuỗi python chứa bộ ký tự

Kiểm tra xem một chuỗi có chứa một tập hợp các ký tự không

Tín dụng: Jürgen Hermann, Horst Hansen

Vấn đề

Bạn cần kiểm tra sự xuất hiện của bất kỳ bộ ký tự nào trong chuỗi.

Dung dịch

Giải pháp khái quát hóa cho bất kỳ chuỗi nào [không chỉ là một chuỗi] và bất kỳ tập hợp nào [bất kỳ đối tượng nào trong đó có thể kiểm tra thành viên với toán tử

[c in str for c in set]
0, không chỉ là một trong các ký tự]:

def containsAny[str, set]:
    """ Check whether sequence str contains ANY of the items in set. """
    return 1 in [c in str for c in set]

def containsAll[str, set]:
    """ Check whether sequence str contains ALL of the items in set. """
    return 0 not in [c in str for c in set]

Thảo luận

Mặc dù các phương thức chuỗi

[c in str for c in set]
1 và
[c in str for c in set]
2 có thể kiểm tra các lần xuất hiện của chuỗi con, không có chức năng nào được tạo sẵn để kiểm tra sự xuất hiện trong một chuỗi của một tập hợp các ký tự.

Trong khi làm việc với một điều kiện để kiểm tra xem một chuỗi có chứa các ký tự đặc biệt được sử dụng trong hàm thư viện tiêu chuẩn

[c in str for c in set]
3 hay không, tôi đã đưa ra mã trên [với sự trợ giúp từ kênh OpenProjects IRC
[c in str for c in set]
4]. Được viết theo cách này, nó thực sự tương thích với suy nghĩ của con người, mặc dù bạn có thể không đưa ra mã đó bằng trực giác. Đó thường là trường hợp với sự hiểu biết danh sách.

Mã sau đây tạo danh sách các giá trị ____ 15/________ 16, một cho mỗi mục trong tập hợp:

[c in str for c in set]

Sau đó, mã này kiểm tra xem có ít nhất một giá trị thực trong danh sách đó không:

1 in [c in str for c in set]

Tương tự, điều này kiểm tra xem không có giá trị giả nào có trong danh sách:

0 not in [c in str for c in set]

Các ví dụ sử dụng được sử dụng tốt nhất dưới dạng các bài kiểm tra đơn vị được gắn vào tệp nguồn

[c in str for c in set]
7 của mô -đun này, với thành ngữ thông thường để đảm bảo rằng các thử nghiệm thực thi nếu mô -đun chạy dưới dạng tập lệnh chính:

if _ _name_ _ == "_ _main_ _":
    # unit tests, must print "OK!" when run
    assert containsAny['*.py', '*?[]']
    assert not containsAny['file.txt', '*?[]']
    assert containsAll['43221', '123']
    assert not containsAll['134', '123']
    print "OK!"

Tất nhiên, trong khi các thành ngữ trước đó gọn gàng, có những lựa chọn thay thế [luôn luôn ở đó?]. Dưới đây là những người ở cơ bản nhất và do đó, theo một nghĩa nào đó, những người thay thế pythonic nhất:

def containsAny[str, set]:
    for c in set:
        if c in str: return 1
    return 0

def containsAll[str, set]:
    for c in set:
        if c not in str: return 0
    return 1

Dưới đây là một số lựa chọn thay thế đảm bảo vòng lặp tối thiểu [lợi nhuận sớm nhất có thể]. Đây là những điều súc tích nhất và do đó, theo một nghĩa nào đó, mạnh mẽ nhất:

from operator import and_, or_, contains

def containsAny[str, set]:
    return reduce[or_, map[contains, len[set]*[str], set]]

def containsAll[str, set]:
    return reduce[and_, map[contains, len[set]*[str], set]]

Dưới đây là một số biến thể mỏng hơn của loại sau dựa vào một phương pháp đặc biệt chỉ cung cấp cho các đối tượng chỉ trong Python 2.2 trở lên:

from operator import and_, or_

def containsAny[str, set]:
    return reduce[or_, map[str._ _contains_ _, set]]

def containsAll[str, set]:
    return reduce[and_, map[str._ _contains_ _, set]]

Và đây là một biến thể khó khăn dựa vào chức năng cũng có sẵn trong 2.0:

def containsAll[str, set]:
    try: map[str.index, set]
    except ValueError: return 0
    else: return 1

May mắn thay, cách tiếp cận khá khó khăn này thiếu một biến thể rõ ràng ngay lập tức áp dụng để thực hiện

[c in str for c in set]
8. Tuy nhiên, một sơ đồ khó khăn cuối cùng, dựa trên khả năng xóa tất cả các ký tự trong một bộ, áp dụng cho cả hai chức năng:

import string
notrans = string.maketrans['', '']  # identity "translation"

def containsAny[str, set]:
    return len[set]!=len[set.translate[notrans, str]]

def containsAll[str, set]:
    return 0==len[set.translate[notrans, str]]

Thủ thuật này ít nhất có một số độ sâu, nó dựa vào

1 in [c in str for c in set]
0 là phần sau của
1 in [c in str for c in set]
1 được tạo thành từ các ký tự không phải trong
1 in [c in str for c in set]
2. Nếu chuỗi con đó có cùng độ dài với
1 in [c in str for c in set]
1, thì không có ký tự nào bị xóa bởi
1 in [c in str for c in set]
4, do đó, không có ký tự của
1 in [c in str for c in set]
1 là trong
1 in [c in str for c in set]
2. Ngược lại, nếu chuỗi con đó có độ dài 0, tất cả các ký tự đã bị xóa, vì vậy tất cả các ký tự của
1 in [c in str for c in set]
1 đều ở trong
1 in [c in str for c in set]
2. Phương pháp
1 in [c in str for c in set]
9 của các đối tượng chuỗi tiếp tục xuất hiện một cách tự nhiên khi người ta muốn coi các chuỗi là bộ ký tự, một phần vì nó rất nhanh và một phần vì nó rất tiện dụng và linh hoạt. Xem Công thức 3.8 cho một ứng dụng tương tự khác.

Một quan sát cuối cùng là những cách khác nhau để tiếp cận nhiệm vụ có mức độ tổng quát rất khác nhau. Ở một thái cực, các cách tiếp cận sớm nhất, chỉ dựa vào

[c in str for c in set]
0 [để lặp lại trên
1 in [c in str for c in set]
2 và để thành viên trong
1 in [c in str for c in set]
1] là chung nhất; Chúng hoàn toàn không giới hạn trong việc xử lý chuỗi và chúng đưa ra nhu cầu thực sự tối thiểu về các biểu diễn của
1 in [c in str for c in set]
2 và
1 in [c in str for c in set]
1. Ở một thái cực khác, cách tiếp cận cuối cùng, dựa vào phương pháp
1 in [c in str for c in set]
9, chỉ hoạt động khi cả
1 in [c in str for c in set]
2 và
1 in [c in str for c in set]
1 là chuỗi hoặc bắt chước các đối tượng chuỗi.

Xem thêm

Công thức 3,8; Tài liệu cho các hàm

1 in [c in str for c in set]
9 và
0 not in [c in str for c in set]
9 trong mô -đun
if _ _name_ _ == "_ _main_ _":
    # unit tests, must print "OK!" when run
    assert containsAny['*.py', '*?[]']
    assert not containsAny['file.txt', '*?[]']
    assert containsAll['43221', '123']
    assert not containsAll['134', '123']
    print "OK!"
0 trong tham chiếu thư viện.Library Reference.

Bài Viết Liên Quan

Chủ Đề