Python in nhiều ký tự

Chúng ta đã biết rằng các chuỗi được định nghĩa là một chuỗi các ký tự và chúng ta có thể thực hiện nhiều thao tác khác nhau trên chúng

Trong hướng dẫn này, chúng ta sẽ tìm hiểu thêm một tác vụ thú vị có thể được thực hiện bằng chuỗi trong Python

Ở đây chúng ta sẽ xem cách chúng ta có thể xóa nhiều ký tự khỏi nó

Chúng tôi đã liệt kê bên dưới các phương pháp mà chúng tôi sẽ học để đáp ứng mục tiêu của chúng tôi

  1. Sử dụng thay thế lồng nhau()
  2. Sử dụng dịch() và maketrans()
  3. Sử dụng subn()
  4. Sử dụng phụ()

Sử dụng thay thế lồng nhau()

Trong chương trình đưa ra dưới đây, chúng ta sẽ thấy cách thay thế () được sử dụng để xóa nhiều ký tự khỏi chuỗi

đầu ra

The initialized string is  learnpythonlearn
The string after replacing the characters is  eearnpythoneearn

Giải trình-

  1. Ở bước đầu tiên, chúng tôi đã khởi tạo chuỗi có các ký tự mà chúng tôi muốn thay thế
  2. Sau này, chúng tôi đã hiển thị chuỗi gốc để chúng tôi có thể dễ dàng hiểu được sự khác biệt giữa chuỗi này và đầu ra dự kiến
  3. Bây giờ chúng tôi đã sử dụng thay thế () và chỉ định các ký tự mà chúng tôi muốn xóa hoặc thay đổi
  4. Khi thực hiện chương trình, đầu ra mong muốn được hiển thị

Trong chương trình thứ hai, chúng ta sẽ xem cách translate() và maketrans() có thể được sử dụng để làm điều tương tự. Người dùng phải ghi nhớ điều này rằng nó chỉ hoạt động trong Python 2

Sử dụng dịch() và maketrans()

Chương trình sau đây cho thấy làm thế nào nó có thể được thực hiện

đầu ra

The initialized string is  learnpythonlearn
The string after replacing the characters is  eearnpythoneearn

Giải trình-

  1. Ở bước đầu tiên, chúng tôi đã khởi tạo chuỗi có các ký tự mà chúng tôi muốn thay thế
  2. Sau này, chúng tôi đã hiển thị chuỗi gốc để chúng tôi có thể dễ dàng hiểu được sự khác biệt giữa chuỗi này và đầu ra dự kiến
  3. Bây giờ chúng tôi đã sử dụng thay thế () và chỉ định các ký tự mà chúng tôi muốn xóa hoặc thay đổi
  4. Khi thực hiện chương trình, đầu ra mong muốn được hiển thị

Bây giờ chúng ta sẽ thảo luận về cách. subn() có thể trở thành công cụ hỗ trợ cho việc này. Subn() trả về một chuỗi mới với tổng số lần thay thế

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

[c in str for c in set]
0, không chỉ 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]

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 sự xuất hiện của chuỗi con, nhưng không có chức năng làm sẵn nào để kiểm tra sự xuất hiện trong một chuỗi gồm 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 chuẩn

[c in str for c in set]
3 hay không, tôi đã nghĩ ra đoạn 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 nghĩ ra mã như vậy bằng trực giác. Đó thường là trường hợp với việc hiểu danh sách

Đoạn mã sau tạo một danh sách các giá trị

[c in str for c in set]
5/
[c in str for c in set]
6, một giá trị 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ị sai nào trong danh sách

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

Các ví dụ về cách sử dụng được truyền tốt nhất dưới dạng các bài kiểm tra đơn vị để được thêm 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 bài kiểm tra 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 rất gọn gàng, vẫn có những lựa chọn thay thế (không phải lúc nào cũng vậy sao?). Dưới đây là những lựa chọn thay thế cơ bản nhất — và do đó, theo một nghĩa nào đó, là những lựa chọn 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 (trả lại sớm nhất có thể). Đây là những điều ngắn gọn 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ể thậm chí còn mỏng hơn của biến thể thứ hai dựa trên một phương thức đặc biệt mà các đối tượng chuỗi chỉ cung cấp 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ể phức tạp dựa trên 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á phức tạp này thiếu một biến thể rõ ràng ngay lập tức có thể áp dụng để thực hiện

[c in str for c in set]
8. Tuy nhiên, một sơ đồ phức tạp cuối cùng, dựa trên khả năng xóa tất cả các ký tự trong một tập hợp của
[c in str for c in set]
9, sẽ á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ũng có chiều sâu—nó dựa vào việc

1 in [c in str for c in set]
0 là dãy con của
1 in [c in str for c in set]
1 được tạo thành từ các ký tự không có trong
1 in [c in str for c in set]
2. Nếu dãy con đó có cùng độ dài với
1 in [c in str for c in set]
1, không có ký tự nào bị xóa bởi
1 in [c in str for c in set]
4, vì vậy không có ký tự nào của
1 in [c in str for c in set]
1 nằm trong
1 in [c in str for c in set]
2. Ngược lại, nếu dãy con đó có độ dài bằng 0, tất cả các ký tự đã bị loại bỏ, do đó, tất cả các ký tự của
1 in [c in str for c in set]
1 nằm trong
1 in [c in str for c in set]
2. Phương thức
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à tập hợp các 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 tiếp cận nhiệm vụ khác nhau này 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 trên
1 in [c in str for c in set]
2 và để trở thành thành viên của
1 in [c in str for c in set]
1) là cách chung nhất; . Ở một thái cực khác, cách tiếp cận cuối cùng, dựa vào phương thức
1 in [c in str for c in set]
9, chỉ hoạt động khi cả hai
1 in [c in str for c in set]
2 và
1 in [c in str for c in set]
1 đều là các chuỗi hoặc chức năng của các đối tượng chuỗi gần giống nhau

công thức 3. số 8;