Tìm chỉ số trước khi lấy danh sách
```python
def find_name(names, target):
for i in range(len(names)):
if names[i] == target:
return i
return -1
```
Sau read_lists, gọi find_name cho từng tên cần so. Nếu một chỉ số là −1, phải báo không có tên trong tệp trước khi đọc lists[index]. Trong Python, lists[−1] có thể lấy danh sách cuối khi tệp không rỗng; đó không phải dữ liệu của tên đang tìm.
Tên mẫu có khoảng trắng nên khi chạy lệnh, đặt từng tên trong dấu nháy, chẳng hạn "Mẫu A" "Mẫu B".
Kiểm thuộc danh sách còn lại
```python
def common_values(A, B):
result = []
for value in A:
if value in B:
result.append(value)
return result
```
Hai danh sách đầu vào không có phần tử trùng. Với mỗi value của A, phép value in B kiểm xem có xuất hiện ở B hay không. Nếu có thì thêm vào result. Số lượng là len(result), cùng một kết quả dùng để đếm và in nên không lệch nhau. Duyệt tiếp tới hết A để giữ mọi phần tử chung.
Với dữ liệu mẫu:
| Chỉ ở A | Chung A và B | Chỉ ở B |
|---|---|---|
| P1 | P2,P3,P4 | P5 |
Kết quả theo thứ tự danh sách A là [P2,P3,P4], số lượng3. Phần tử P1 bị bỏ vì không nằm trong B; P5 không nằm trong A nên không được thêm.
Chạy và kiểm cả số lượng lẫn tên
Tải mã và tệp liên hệ vào cùng thư mục rồi chạy:
```text
python3 g11-cs-danh-sach-chung.py chung g11-cs-lien-he.inp "Mẫu A" "Mẫu B"
```
Cần thấy số 3 và danh sách[P2,P3,P4]. Thử Mẫu A với Mẫu D để nhận 0 và[]; thử một tên không có trong tệp để nhận thông báo phù hợp, không lấy nhầm dòng cuối.
Với A dài m và B dài n, phép in trên danh sách có thể phải tìm qua n phần tử; vòng ngoài duyệt m phần tử nên cách này có bậc O(mn) trong trường hợp xấu nhất. Có một vòng for viết ra chưa có nghĩa toàn bộ công việc chỉ O(m).
Bài luyện
Với tệp mẫu, danh sách chung của Mẫu A và Mẫu B là gì?
P5 không thuộc danh sách A.
Ba phần tử này đều có ở cả hai danh sách.
Đây gồm cả phần tử chỉ có một phía.
P1 không thuộc danh sách B.
Lời giải
Duyệt P1,P2,P3,P4 của A: P1 không có trong B, ba phần tử còn lại đều có. Vì vậy nhận P2,P3,P4 và số lượng3.
Bài luyện
find_name trả −1 cho tên chưa có. Cần làm gì trước khi đọc lists[index]?
Không được tự tạo liên hệ như vậy.
0 vẫn có thể là dữ liệu của tên khác.
−1 là tín hiệu không tìm thấy.
−1 có thể lấy dòng cuối của dữ liệu khác.
Lời giải
Chỉ số −1 không xác định tài khoản cần tìm. Python cho phép chỉ số âm nên phải kiểm tín hiệu trước; nếu không sẽ lấy sai danh sách cuối.
Bài luyện
Vì sao cần duyệt tiếp sau khi tìm thấy P2 chung?
P2 có trong cả A và B.
Chính yêu cầu tất cả mới cần tiếp tục ở đây.
Chỉ phần tử thuộc cả hai danh sách mới hợp lệ.
Yêu cầu là mọi phần tử chung, không chỉ một.
Lời giải
P2 là một kết quả nhưng chưa phải toàn bộ. Duyệt các phần tử còn lại của A còn tìm thấy P3,P4, nên cần tiếp tục tới hết miền.
Bài luyện
Nếu danh sách chung là[], số lượng cần in là gì?
len([])=0.
Danh sách rỗng không có một phần tử.
−1 là tín hiệu chỉ số không tìm thấy, không phải số lượng chung.
Đó là một dữ liệu khác.
Lời giải
Số đếm được lấy từ len(result). Không có phần tử trong result thì số lượng0, đồng thời danh sách in ra là[].
Đang học