Cách thêm dòng mới vào từ điển trong python

Chương này được trích từ cuốn sách A Primer on Scientific Programming with Python của H. P. Langtangen, tái bản lần thứ 5, Springer, 2016

Nhiều chương trình cần thao tác với văn bản. Ví dụ: khi chúng tôi đọc nội dung của tệp thành một chuỗi hoặc danh sách các chuỗi [dòng], chúng tôi có thể muốn thay đổi các phần của văn bản trong [các] chuỗi - và có thể ghi văn bản đã sửa đổi vào một tệp mới. Cho đến nay trong tài liệu này, chúng tôi đã chuyển đổi các phần của văn bản thành số và tính toán với các số. Bây giờ là lúc để học cách tự thao tác với các chuỗi văn bản

Các thao tác phổ biến trên chuỗi

Python có một tập hợp phong phú các thao tác trên các đối tượng chuỗi. Một số hoạt động phổ biến nhất được liệt kê dưới đây

đặc tả chuỗi con

Biểu thức

>>> 'Berlin' in s:
True
>>> 'Oslo' in s:
False
9 trích xuất chuỗi con bắt đầu bằng ký tự số
>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
0 và kết thúc bằng ký tự số
>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
1 [tương tự như danh sách,
>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
2 là chỉ số của ký tự đầu tiên]

>>> s = 'Berlin: 18.4 C at 4 pm'
>>> s[8:]     # from index 8 to the end of the string
'18.4 C at 4 pm'
>>> s[8:12]   # index 8, 9, 10 and 11 [not 12!]
'18.4'

Như thường lệ, chỉ số trên âm được tính từ bên phải sao cho

>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
3 là phần tử cuối cùng,
>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
4 là phần tử cuối cùng tiếp theo, v.v.

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'

Tìm kiếm chuỗi con

Cuộc gọi

>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
5 trả về chỉ mục nơi chuỗi con
>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
6 xuất hiện lần đầu trong
>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
7. Nếu không tìm thấy chuỗi con, -1 được trả về

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1

Đôi khi mục đích chỉ là kiểm tra xem một chuỗi có nằm trong một chuỗi khác hay không và sau đó chúng ta có thể sử dụng cú pháp

>>> 'Berlin' in s:
True
>>> 'Oslo' in s:
False

Đây là cách sử dụng điển hình của cấu trúc thứ hai trong bài kiểm tra

>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
8

>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found

Hai phương pháp thuận tiện khác để kiểm tra xem một chuỗi bắt đầu bằng hay kết thúc bằng một chuỗi đã chỉ định là

>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
9 và
>>> s.startswith['Berlin']
True
>>> s.endswith['am']
False
0

>>> s.startswith['Berlin']
True
>>> s.endswith['am']
False

Thay thế

Cuộc gọi

>>> s.startswith['Berlin']
True
>>> s.endswith['am']
False
1 thay thế chuỗi con
>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
6 bởi
>>> s.startswith['Berlin']
True
>>> s.endswith['am']
False
3 ở mọi nơi trong
>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
7

>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'

Một biến thể của ví dụ trước, trong đó một số thao tác chuỗi được đặt cùng nhau, bao gồm thay thế văn bản trước dấu hai chấm đầu tiên

>>> s.replace[s[:s.find[':']], 'Bonn']
'Bonn: 18.4 C at 4 pm'

Hãy nghỉ ngơi tại thời điểm này và thuyết phục bản thân rằng bạn hiểu cách chúng tôi chỉ định chuỗi con sẽ được thay thế

tách chuỗi

Cuộc gọi

>>> s.startswith['Berlin']
True
>>> s.endswith['am']
False
5 chia chuỗi
>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
7 thành các từ được phân tách bằng khoảng trắng [dấu cách, trình lập bảng hoặc xuống dòng]

>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']

Việc tách chuỗi

>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
7 thành các từ được phân tách bằng văn bản
>>> s.startswith['Berlin']
True
>>> s.endswith['am']
False
8 có thể được thực hiện bởi
>>> s.startswith['Berlin']
True
>>> s.endswith['am']
False
9. Ví dụ: chúng ta có thể tách đối với dấu hai chấm

>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']

Chúng ta biết rằng

>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
7 chứa tên thành phố, dấu hai chấm, nhiệt độ và sau đó là
>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'
1

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
0

Với

>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'
2, một chuỗi nhiều dòng được chia thành các dòng [rất hữu ích khi một tệp đã được đọc thành một chuỗi và chúng tôi muốn có một danh sách các dòng]

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
1

Viết in hoa và viết thường

>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'
3 chuyển đổi tất cả các ký tự thành chữ thường tương đương và
>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'
4 thực hiện chuyển đổi tương tự thành chữ in hoa

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
2

Chuỗi là hằng số

Một chuỗi không thể thay đổi, tôi. e. , mọi thay đổi luôn dẫn đến một chuỗi mới. Không thể thay thế ký tự

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
3

Nếu chúng ta muốn thay thế

>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'
5, thì phải xây dựng một chuỗi mới, chẳng hạn bằng cách giữ các chuỗi con ở hai bên của
>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'
5 và chèn một
>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'
7 vào giữa

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
4

Chuỗi chỉ có chữ số

Người ta có thể dễ dàng kiểm tra xem một chuỗi chỉ chứa các chữ số hay không

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
5

Khoảng trắng

Chúng ta cũng có thể kiểm tra xem một chuỗi có chứa khoảng trắng hay không bằng cách gọi phương thức

>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'
8. Chính xác hơn,
>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'
8 kiểm tra khoảng trắng, có nghĩa là ký tự khoảng trắng, dòng mới hoặc ký tự TAB

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
6

>>> s.replace[' ', '_']
'Berlin:_18.4_C__at_4_pm'
>>> s.replace['Berlin', 'Bonn']
'Bonn: 18.4 C at 4 pm'
8 rất hữu ích để kiểm tra các dòng trống trong tệp. Một cách khác là tước trước rồi kiểm tra chuỗi rỗng

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
7

Việc loại bỏ các khoảng trắng ở đầu và/hoặc ở cuối trong một chuỗi đôi khi rất hữu ích

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
8

tham gia chuỗi

Ngược lại với phương thức

>>> s.replace[s[:s.find[':']], 'Bonn']
'Bonn: 18.4 C at 4 pm'
1 là
>>> s.replace[s[:s.find[':']], 'Bonn']
'Bonn: 18.4 C at 4 pm'
2, nối các phần tử trong danh sách các chuỗi với một dấu phân cách được chỉ định ở giữa. Tức là hai loại câu lệnh sau đây là phép toán nghịch đảo

>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
9

Một ví dụ về việc sử dụng

>>> s.replace[s[:s.find[':']], 'Bonn']
'Bonn: 18.4 C at 4 pm'
2 có thể là

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1
0

Để minh họa cho tính hữu ích của

>>> s.replace[s[:s.find[':']], 'Bonn']
'Bonn: 18.4 C at 4 pm'
1 và
>>> s.replace[s[:s.find[':']], 'Bonn']
'Bonn: 18.4 C at 4 pm'
2, chúng tôi muốn xóa hai từ đầu tiên trên một dòng. Nhiệm vụ này có thể được thực hiện bằng cách đầu tiên tách dòng thành các từ và sau đó nối các từ quan tâm

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1
1

Có nhiều phương thức khác trong các đối tượng chuỗi. Tất cả các phương pháp được mô tả trong phần của tài liệu trực tuyến Thư viện tiêu chuẩn Python

Thí dụ. Đọc các cặp số

Vấn đề

Giả sử chúng ta có một tệp bao gồm các cặp số thực, i. e. , văn bản có dạng \[ [a,b] \], trong đó \[ a \] và \[ b \] là các số thực. Ký hiệu này cho một cặp số thường được sử dụng cho các điểm trong mặt phẳng, các vectơ trong mặt phẳng và các số phức. Một tệp mẫu có thể trông như sau

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1
2

Tệp có thể được tìm thấy dưới dạng

>>> s.replace[s[:s.find[':']], 'Bonn']
'Bonn: 18.4 C at 4 pm'
6. Nhiệm vụ của chúng ta là đọc văn bản này thành một danh sách lồng nhau
>>> s.replace[s[:s.find[':']], 'Bonn']
'Bonn: 18.4 C at 4 pm'
7 sao cho
>>> s.replace[s[:s.find[':']], 'Bonn']
'Bonn: 18.4 C at 4 pm'
8 giữ cặp có chỉ số
>>> if 'C' in s:
..     print 'C found'
.. else:
..     print 'no C'
...
C found
0 và cặp này là một bộ gồm hai đối tượng
>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
0. Chúng tôi giả sử rằng không có khoảng trống nào bên trong dấu ngoặc đơn của một cặp số [chúng tôi dựa vào thao tác tách, thao tác này sẽ không hoạt động nếu không]

Giải pháp

Để giải quyết vấn đề lập trình này, chúng ta có thể đọc từng dòng trong tệp; . chia dòng thành các từ [i. e. , tách theo khoảng trắng]; . loại bỏ các dấu ngoặc đơn, phân tách theo dấu phẩy và chuyển đổi hai từ kết quả thành số float. Thuật toán ngắn gọn của chúng tôi có thể được dịch gần như trực tiếp sang mã Python

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1
3

Mã này có sẵn trong tệp read_pairs1. py. Câu lệnh

>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
1 là cách đọc tệp hiện đại của Python, với ưu điểm là chúng ta không cần nghĩ đến việc đóng tệp. Hình minh họa ảnh chụp nhanh trạng thái của các biến trong chương trình sau khi đã xử lý dòng đầu tiên. Bạn nên giải thích từng dòng trong chương trình cho chính mình và so sánh sự hiểu biết của bạn với hình

Hình 3. Minh họa các biến trong chương trình

>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
2 sau lần đầu tiên vượt qua vòng lặp trên các từ trong dòng đầu tiên của tệp dữ liệu

Đầu ra từ chương trình trở thành

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1
4

Chúng tôi nhận xét rằng giải pháp của chúng tôi cho vấn đề lập trình này phụ thuộc rất nhiều vào thực tế là không được phép có khoảng trắng bên trong dấu ngoặc đơn. Nếu khoảng trắng được cho phép, việc phân tách đơn giản để có được các cặp trên một dòng dưới dạng từ sẽ không hoạt động. Sau đó chúng ta có thể làm gì?

Trước tiên, chúng ta có thể loại bỏ tất cả các khoảng trống trên một dòng, sau đó quan sát rằng các cặp được phân tách bằng văn bản

>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
3. Cặp đầu tiên và cặp cuối cùng trên một dòng sẽ có thêm dấu ngoặc đơn mà chúng ta cần xóa. Phần còn lại của mã tương tự như mã trước đó và có thể được tìm thấy trong read_pairs2. py

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1
5

Chương trình có thể được kiểm tra trên tệp

>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
4

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1
6

Cách tiếp cận thứ ba là lưu ý rằng nếu các cặp được phân tách bằng dấu phẩy,

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1
7

văn bản tệp rất gần với cú pháp Python của danh sách 2 bộ. Chúng tôi chỉ bỏ lỡ các dấu ngoặc kèm theo

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1
8

Chạy

>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
5 trên văn bản này sẽ tự động tạo đối tượng danh sách mà chúng ta muốn xây dựng. Tất cả những gì chúng ta cần làm là đọc tệp thành một chuỗi, thêm dấu phẩy sau mỗi dấu ngoặc đơn bên phải, thêm dấu ngoặc mở và đóng và gọi ____
>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
5 [chương trình read_pairs3. py]

>>> s.find['Berlin']  # where does 'Berlin' start?
0
>>> s.find['pm']
20
>>> s.find['Oslo']    # not found
-1
9

Nói chung, nên xây dựng các định dạng tệp càng gần với cú pháp Python hợp lệ càng tốt để người ta có thể tận dụng các hàm

>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
5 hoặc
>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
8 để biến văn bản thành "đối tượng trực tiếp"

Thí dụ. Đọc tọa độ

Vấn đề

Giả sử chúng ta có một tệp có tọa độ \[ [x,y,z] \] trong không gian ba chiều. Định dạng tệp trông như sau

>>> 'Berlin' in s:
True
>>> 'Oslo' in s:
False
0

Mục tiêu là đọc tệp này và tạo một danh sách có 3 bộ 3 bộ

>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
9, sau đó chuyển đổi danh sách lồng nhau thành một mảng hai chiều mà chúng ta có thể tính toán

Lưu ý rằng đôi khi có khoảng cách giữa các dấu hiệu

>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
0 và số sau và đôi khi không. Do đó, việc chia tách liên quan đến không gian và trích xuất từng từ thứ hai không phải là một tùy chọn. Chúng tôi sẽ trình bày ba giải pháp

Giải pháp 1. khai thác chuỗi con

Định dạng tệp trông rất đều đặn với các văn bản

>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
1,
>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
2 và
>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
3 bắt đầu trong cùng một cột ở mỗi dòng. Bằng cách đếm các ký tự, chúng tôi nhận thấy rằng văn bản
>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
1 bắt đầu ở cột 2, văn bản
>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
2 bắt đầu ở cột 16, trong khi văn bản
>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
3 bắt đầu ở cột 31. giới thiệu

>>> 'Berlin' in s:
True
>>> 'Oslo' in s:
False
1

ba số trong chuỗi

>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
7 được lấy làm chuỗi con

>>> 'Berlin' in s:
True
>>> 'Oslo' in s:
False
2

Đoạn mã sau, được tìm thấy trong tệp file2coor_v1. py, tạo mảng

>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
8 có hình dạng \[ [n,3] \], trong đó \[ n \] là số tọa độ \[ [x,y,z] \]

>>> 'Berlin' in s:
True
>>> 'Oslo' in s:
False
3

Câu lệnh

>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
9 bên trong vòng lặp luôn được đưa vào một cách khôn ngoan khi thực hiện các thao tác với chuỗi, đơn giản vì việc đếm các chỉ số cho các giới hạn chuỗi con nhanh chóng dẫn đến lỗi. Chạy chương trình, đầu ra từ vòng lặp trông như thế này

>>> 'Berlin' in s:
True
>>> 'Oslo' in s:
False
4

cho dòng đầu tiên trong tệp. Dấu ngoặc kép hiển thị phạm vi chính xác của tọa độ được trích xuất. Lưu ý rằng trích dẫn cuối cùng xuất hiện trên dòng tiếp theo. Điều này là do

>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
7 có một dòng mới ở cuối [dòng mới này phải ở đó để xác định cuối dòng] và chuỗi con
>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
01 chứa dòng mới ở cuối của
>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
7. Viết
>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
03 sẽ khiến dòng mới nằm ngoài tọa độ \[z \]. Tuy nhiên, điều này không có tác dụng trong thực tế vì chúng tôi chuyển đổi các chuỗi con thành
>>> s.split[]
['Berlin:', '18.4', 'C', 'at', '4', 'pm']
0 và một dòng mới bổ sung hoặc các khoảng trống khác không gây hại gì

Đối tượng

>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
8 ở cuối chương trình có giá trị

>>> 'Berlin' in s:
True
>>> 'Oslo' in s:
False
5

Giải pháp 2. tìm kiếm chuỗi

Một vấn đề với cách tiếp cận giải pháp ở trên là chương trình sẽ không hoạt động nếu định dạng tệp có thể thay đổi vị trí cột của

>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
1,
>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
2 hoặc
>>> s.split[':']
['Berlin', ' 18.4 C at 4 pm']
3. Thay vì mã hóa cứng các số cho các vị trí cột, chúng ta có thể sử dụng phương thức
>>> s[8:-1]
'18.4 C at 4 p'
>>> s[8:-8]
'18.4 C'
09 trong các đối tượng chuỗi để định vị các vị trí cột này

>>> 'Berlin' in s:
True
>>> 'Oslo' in s:
False
6

Phần còn lại của mã tương tự như chương trình hoàn chỉnh được liệt kê ở trên và mã hoàn chỉnh được lưu trữ trong tệp file2coor_v2. py

Giải pháp 3. tách chuỗi

Tách chuỗi là một công cụ mạnh mẽ, cũng như trong trường hợp hiện tại. Hãy để chúng tôi chia đối với dấu bằng. Dòng đầu tiên trong tệp sau đó cung cấp cho chúng tôi các từ

>>> 'Berlin' in s:
True
>>> 'Oslo' in s:
False
7

Chúng tôi loại bỏ từ đầu tiên và loại bỏ ký tự cuối cùng trong từ tiếp theo. Từ cuối cùng có thể được sử dụng như là. Chương trình hoàn chỉnh được tìm thấy trong tệp file2coor_v3. py và trông giống như

Chủ Đề