Câu hỏi Có cách nào để chuỗi con một chuỗi trong Python?


Có cách nào để chuỗi con một chuỗi trong Python, để có được một chuỗi mới từ ký tự thứ 3 đến cuối chuỗi?

Có thể thích myString[2:end]?

Nếu rời phần thứ hai có nghĩa là 'đến cuối', nếu bạn rời phần đầu tiên, nó có bắt đầu từ đầu không?


1595
2018-03-19 17:29


gốc


Điều này chứa một lời giải thích rõ ràng pythoncentral.io/cutting-and-slicing-strings-in-python - Mario Ruiz


Các câu trả lời:


>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Python gọi khái niệm này là "slicing" và nó hoạt động nhiều hơn chỉ là chuỗi. Hãy xem đây để giới thiệu toàn diện.


2417
2018-03-19 17:30





Chỉ cần cho đầy đủ như không ai khác đã đề cập đến nó. Tham số thứ ba cho một mảng mảng là một bước. Vì vậy, đảo ngược một chuỗi là đơn giản như:

some_string[::-1]

Hoặc chọn các ký tự thay thế sẽ là:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

Khả năng bước tiến và lùi qua chuỗi duy trì tính nhất quán với việc có thể mảng mảng từ đầu hoặc cuối.


305
2018-03-20 00:58



@mtahmed hoàn toàn liên quan đến câu hỏi. Điều gì sẽ xảy ra nếu bạn muốn chuỗi con bằng cách chọn các ký tự thay thế từ chuỗi? Đó sẽ là my_string [:: 2] - Endophage
Tôi nghĩ có nhiều khả năng bạn muốn đề cập đến tham số thứ ba để cắt. Cần phải có được tất cả các nhân vật khác từ một chuỗi có thể là một trường hợp sử dụng quan trọng ở đâu đó, nhưng tôi chưa bao giờ phải làm điều đó. Không phải là có điều gì sai trái khi muốn thể hiện những gì bạn biết - đó là điểm của việc biết mọi thứ nếu bạn không thể làm điều đó. :) Nhưng trường hợp liên quan đến câu hỏi được phóng đại. - John Lockwood
Chắc chắn, ví dụ cụ thể về việc chọn các ký tự thay thế có thể không liên quan đến câu hỏi, nhưng sự hiểu biết có một tham số thứ 3 để cắt rất nhiều là có liên quan và các ví dụ đơn giản để minh họa cách hoạt động của nó. Cộng đồng Python cũng có một lịch sử tuyệt vời để giáo dục các thành viên mới một cách thân thiện :-) - Endophage


Substr () bình thường (tức là PHP và Perl) hoạt động theo cách này:

s = Substr(s, beginning, LENGTH)

Vì vậy, các thông số beginning và LENGTH.

Nhưng hành vi của Python thì khác; nó dự kiến ​​bắt đầu và một sau END (!). Đây là khó khăn để phát hiện bởi người mới bắt đầu. Vì vậy, thay thế chính xác cho Substr (s, start, LENGTH) là

s = s[ beginning : beginning + LENGTH]

92
2017-08-04 11:43



Người mới bắt đầu nên học theo cách nhiệt đới khi chuyển sang python, không dính vào thói quen ngôn ngữ khác - Nicolae Surdu


Một cách phổ biến để đạt được điều này là bởi String slicing. MyString[a:b] cung cấp cho bạn một chuỗi con từ chỉ mục a đến (b - 1)


45
2018-03-02 05:19



đơn giản và dễ dàng. cảm ơn - Jacky Supit


Một ví dụ dường như bị thiếu ở đây: bản sao đầy đủ (nông).

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>> 

Đây là một thành ngữ phổ biến để tạo một bản sao của các loại trình tự (không phải của chuỗi nội bộ). [:] Nông bản sao danh sách, Xem python-list-slice-sử dụng-vì-không-rõ ràng-lý do.


17
2018-03-19 18:02



Điều này hầu như không liên quan gì đến câu hỏi về chuỗi con. Thậm chí không áp dụng cho chuỗi. Nói stringA = stringB là đủ ... - Nicolae Surdu
Bản sao đầy đủ của [:] tạo một BẢN SAO MỚI, sử dụng cú pháp slice và được đọc là "chuỗi con từ đầu đến cuối" - gimel
Điều gì là quan trọng vì chuỗi là bất biến? a=b nên là đủ. - bfontaine
@gimel: Thực ra, [:] trên một loại bất biến không tạo ra một bản sao nào cả. Trong khi mysequence[:] hầu hết là vô hại khi mysequence là một loại bất biến như str, tuple, bytes (Py3) hoặc unicode (Py2), a = b[:] tương đương với a = b, nó chỉ lãng phí một chút thời gian gửi các mã byte cắt mà đối tượng phản hồi bằng cách tự trả về vì nó vô nghĩa đối với bản sao nông khi, ngoài các kiểm tra nhận dạng đối tượng, nó tương đương với việc trả về một tham chiếu khác về bản ngã bất biến của nó. - ShadowRanger
Cố gắng tóm tắt các chỉ trích khác về câu trả lời này: Trong Python, các chuỗi là không thay đổi, do đó không có lý do gì để tạo một bản sao của một chuỗi - vì vậy s[:] không tạo ra một bản sao nào cả: s = 'abc'; s0 = s[:]; assert s is s0. Vâng, đó là cách thành ngữ để sao chép danh sách bằng Python cho đến khi danh sách list.copy, nhưng một lát đầy đủ của một loại bất biến không có lý do để tạo một bản sao vì nó không thể thay đổi được, vì vậy cũng có thể chỉ có một phần trong bộ nhớ và chúng ta không nên lãng phí thời gian sao chép nó. Vì câu trả lời này là sai và thậm chí không trả lời câu hỏi - nó có nên bị xóa không? - Aaron Hall♦


Có cách nào để chuỗi con một chuỗi trong Python, để có được một chuỗi mới từ ký tự thứ 3 đến cuối chuỗi?

Có thể thích myString[2:end]?

Có, điều này thực sự hiệu quả nếu bạn chỉ định hoặc trói buộc, tên,end, liên tục singleton, None:

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'

Ký hiệu slice có 3 đối số quan trọng:

  • khởi đầu
  • dừng lại
  • bậc thang

Mặc định của họ khi không được đưa ra là None - nhưng chúng tôi có thể chuyển chúng một cách rõ ràng:

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'

Nếu rời phần thứ hai có nghĩa là 'đến cuối', nếu bạn rời phần đầu tiên, nó có bắt đầu từ đầu không?

Có, ví dụ:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'

Lưu ý rằng chúng tôi bao gồm bắt đầu trong lát, nhưng chúng tôi chỉ đi đến và không bao gồm, dừng lại.

Khi bước là None, theo mặc định, sử dụng slice 1 cho bước. Nếu bạn bước với một số nguyên âm, Python đủ thông minh để đi từ đầu đến cuối.

>>> myString[::-1]
'0987654321'

Tôi giải thích ký hiệu cắt lát một cách chi tiết trong câu trả lời của tôi để giải thích ký hiệu slice Câu hỏi. 


13
2018-06-23 21:53





Bạn đã có nó ngay ở đó ngoại trừ "kết thúc". Nó được gọi là ký hiệu slice. Ví dụ của bạn nên đọc:

new_sub_string = myString[2:]

Nếu bạn bỏ qua tham số thứ hai, nó hoàn toàn là phần cuối của chuỗi.


7
2018-03-19 17:31





Tôi muốn thêm hai điểm vào cuộc thảo luận:

  1. Bạn có thể dùng None thay vào đó trên một khoảng trống để chỉ định "từ đầu" hoặc "đến cuối":

    'abcde'[2:None] == 'abcde'[2:] == 'cde'
    

    Điều này đặc biệt hữu ích trong các hàm, nơi bạn không thể cung cấp một không gian trống làm đối số:

    def substring(s, start, end):
        """Remove `start` characters from the beginning and `end` 
        characters from the end of string `s`.
    
        Examples
        --------
        >>> substring('abcde', 0, 3)
        'abc'
        >>> substring('abcde', 1, None)
        'bcde'
        """
        return s[start:end]
    
  2. Python có lát cắt các đối tượng:

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'
    

6
2017-08-31 04:28