Bài 3.11. Tạo List số trong Python

Bài 3.11. Tạo List số trong Python
Có nhiều lý do để lưu trữ một tập hợp các số. Ví dụ, bạn sẽ cần theo dõi vị trí của từng nhân vật trong một trò chơi, và bạn có thể muốn theo dõi điểm cao của người chơi. Trong các hình ảnh hóa dữ liệu, bạn sẽ gần như luôn làm việc với các tập hợp số, chẳng hạn như nhiệt độ, khoảng cách, kích thước dân số, hoặc giá trị vĩ độ và kinh độ, trong số các loại tập hợp số khác.
Danh sách là lý tưởng để lưu trữ các tập hợp số, và Python cung cấp nhiều công cụ để giúp bạn làm việc hiệu quả với các danh sách số. Khi bạn hiểu cách sử dụng các công cụ này một cách hiệu quả, mã của bạn sẽ hoạt động tốt ngay cả khi danh sách của bạn chứa hàng triệu mục.
Sử dụng hàm range()
Hàm range() của Python làm cho việc tạo ra một dãy số trở nên dễ dàng. Ví dụ, bạn có thể sử dụng hàm range() để in ra một dãy số như sau:
for value in range(1, 5):
print(value)
Mặc dù mã này trông như thể nó sẽ in ra các số từ 1 đến 5, nhưng nó không in ra số 5:
1
2
3
4
Trong ví dụ này, range() chỉ in ra các số từ 1 đến 4. Đây là một kết quả khác của hành vi lệch một mà bạn sẽ thấy thường xuyên trong các ngôn ngữ lập trình. Hàm range() khiến Python bắt đầu đếm từ giá trị đầu tiên bạn cung cấp, và nó dừng lại khi đạt đến giá trị thứ hai bạn cung cấp. Vì nó dừng lại ở giá trị thứ hai, đầu ra không bao giờ chứa giá trị cuối cùng, trong trường hợp này là 5.
Để in ra các số từ 1 đến 5, bạn sẽ sử dụng range(1, 6):
for value in range(1, 6):
print(value)
Lần này đầu ra bắt đầu từ 1 và kết thúc ở 5:
1
2
3
4
5
Nếu đầu ra của bạn khác với những gì bạn mong đợi khi sử dụng range(), hãy thử điều chỉnh giá trị cuối cùng của bạn lên 1.
Bạn cũng có thể truyền cho range() chỉ một đối số, và nó sẽ bắt đầu dãy số từ 0. Ví dụ, range(6) sẽ trả về các số từ 0 đến 5.
Sử dụng range() để tạo danh sách số
Nếu bạn muốn tạo một danh sách số, bạn có thể chuyển đổi kết quả của range() trực tiếp thành một danh sách bằng cách sử dụng hàm list(). Khi bạn bao quanh list() xung quanh một lệnh gọi đến hàm range(), đầu ra sẽ là một danh sách các số.
Trong ví dụ ở phần trước, chúng ta chỉ đơn giản in ra một dãy số. Chúng ta có thể sử dụng list() để chuyển đổi cùng một tập hợp số đó thành một danh sách:
numbers = list(range(1, 6))
print(numbers)
Đây là kết quả:
[1, 2, 3, 4, 5]
Chúng ta cũng có thể sử dụng hàm range() để yêu cầu Python bỏ qua các số trong một phạm vi nhất định. Nếu bạn truyền một đối số thứ ba cho range(), Python sử dụng giá trị đó làm kích thước bước khi tạo ra các số.
Ví dụ, đây là cách liệt kê các số chẵn giữa 1 và 10:
even_numbers = list(range(2, 11, 2))
print(even_numbers)
Trong ví dụ này, hàm range() bắt đầu với giá trị 2 và sau đó thêm 2 vào giá trị đó. Nó thêm 2 liên tục cho đến khi đạt đến hoặc vượt qua giá trị cuối cùng, 11, và tạo ra kết quả này:
[2, 4, 6, 8, 10]
Bạn có thể tạo ra hầu như bất kỳ tập hợp số nào bạn muốn bằng cách sử dụng hàm range(). Ví dụ, hãy xem xét cách bạn có thể tạo ra một danh sách các số bình phương đầu tiên (tức là bình phương của mỗi số nguyên từ 1 đến 10). Trong Python, hai dấu sao (**) đại diện cho số mũ. Đây là cách bạn có thể đưa các số bình phương đầu tiên vào một danh sách:
squares = []
for value in range(1, 11):
square = value ** 2
squares.append(square)
print(squares)
Chúng ta bắt đầu với một danh sách trống có tên là squares. Sau đó, chúng ta yêu cầu Python lặp qua từng giá trị từ 1 đến 10 bằng cách sử dụng hàm range(). Bên trong vòng lặp, giá trị hiện tại được nâng lên lũy thừa hai và gán cho biến square. Mỗi giá trị mới của square sau đó được thêm vào danh sách squares. Cuối cùng, khi vòng lặp đã hoàn thành, danh sách các số bình phương được in ra:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Để viết mã này ngắn gọn hơn, bỏ qua biến tạm thời square và thêm trực tiếp mỗi giá trị mới vào danh sách:
squares = []
for value in range(1, 11):
squares.append(value ** 2)
print(squares)
Dòng này thực hiện cùng công việc như các dòng bên trong vòng lặp for trong danh sách trước đó. Mỗi giá trị trong vòng lặp được nâng lên lũy thừa hai và sau đó ngay lập tức được thêm vào danh sách các số bình phương.
Bạn có thể sử dụng bất kỳ cách tiếp cận nào trong số này khi bạn đang tạo ra các danh sách phức tạp hơn. Đôi khi sử dụng một biến tạm thời làm cho mã của bạn dễ đọc hơn; những lần khác nó làm cho mã không cần thiết dài. Tập trung trước tiên vào việc viết mã mà bạn hiểu rõ ràng và làm những gì bạn muốn nó làm. Sau đó tìm kiếm các cách tiếp cận hiệu quả hơn khi bạn xem xét lại mã của mình.
Thống kê đơn giản với danh sách số
Một vài hàm Python hữu ích khi làm việc với danh sách số. Ví dụ, bạn có thể dễ dàng tìm thấy giá trị nhỏ nhất, lớn nhất và tổng của một danh sách số:
>>> digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> min(digits)
0
>>> max(digits)
9
>>> sum(digits)
45
Hiểu danh sách
Cách tiếp cận được mô tả trước đó để tạo ra danh sách squares bao gồm việc sử dụng ba hoặc bốn dòng mã. Một hiểu danh sách cho phép bạn tạo ra cùng một danh sách chỉ trong một dòng mã. Một hiểu danh sách kết hợp vòng lặp for và việc tạo ra các phần tử mới thành một dòng, và tự động thêm mỗi phần tử mới. Hiểu danh sách không phải lúc nào cũng được trình bày cho người mới bắt đầu, nhưng tôi đã bao gồm chúng ở đây vì bạn sẽ rất có thể thấy chúng ngay khi bạn bắt đầu xem mã của người khác.
Ví dụ sau đây xây dựng cùng một danh sách các số bình phương mà bạn đã thấy trước đó nhưng sử dụng một hiểu danh sách:
squares = [value ** 2 for value in range(1, 11)]
print(squares)
Để sử dụng cú pháp này, bắt đầu với một tên mô tả cho danh sách, chẳng hạn như squares. Tiếp theo, mở một tập hợp dấu ngoặc vuông và định nghĩa biểu thức cho các giá trị bạn muốn lưu trữ trong danh sách mới. Trong ví dụ này, biểu thức là value 2, nâng giá trị lên lũy thừa hai. Sau đó, viết một vòng lặp for để tạo ra các số bạn muốn đưa vào biểu thức, và đóng dấu ngoặc vuông. Vòng lặp for trong ví dụ này là for value in range(1, 11), đưa các giá trị từ 1 đến 10 vào biểu thức value 2. Lưu ý rằng không có dấu hai chấm ở cuối câu lệnh for.
Kết quả là cùng một danh sách các số bình phương mà bạn đã thấy trước đó:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
Cần thực hành để viết các hiểu danh sách của riêng bạn, nhưng bạn sẽ thấy chúng đáng giá khi bạn trở nên thoải mái hơn trong việc tạo ra các danh sách thông thường. Khi bạn đang viết ba hoặc bốn dòng mã để tạo ra các danh sách và nó bắt đầu cảm thấy lặp đi lặp lại, hãy xem xét việc viết các hiểu danh sách của riêng bạn.
Bài tập ví dụ: Phân tích doanh thu cửa hàng
Mô tả:
Viết chương trình giúp chuỗi cửa hàng phân tích hiệu quả kinh doanh theo từng chi nhánh.
Mỗi chi nhánh có:
- Doanh thu từng quý (4 quý)
- Một số chi phí phát sinh
Chương trình cần:
- Tính lợi nhuận cho từng chi nhánh
- Tính tổng lợi nhuận toàn hệ thống
- Tìm chi nhánh có lợi nhuận cao nhất
- Đếm số chi nhánh thua lỗ
- Sắp xếp danh sách chi nhánh theo tiêu chí:
- Lợi nhuận giảm dần
- Nếu lợi nhuận bằng nhau: tổng doanh thu giảm dần
- Nếu bằng nhau: theo tên tăng dần
Input:
- Dòng 1: Số nguyên
n
(1 ≤ n ≤ 100) – số lượng chi nhánh - Với mỗi chi nhánh gồm:
- Dòng 1: Tên chi nhánh
- Dòng 2: 4 số thực – doanh thu theo từng quý
- Dòng 3: Số nguyên
k
– số loại chi phí k
dòng tiếp theo: mỗi dòng gồm tên chi phí và số tiền (số thực)
Output:
- Dòng 1: Tổng lợi nhuận toàn hệ thống
- Dòng 2: Tên chi nhánh có lợi nhuận cao nhất và số tiền
- Dòng 3: Số chi nhánh thua lỗ
- Các dòng tiếp theo: Danh sách chi nhánh theo thứ tự yêu cầu (tên và lợi nhuận)
Ví dụ:
Input:
3
Chi nhánh Hà Nội
100.5 150.2 200.3 180.8
2
Tiền thuê mặt bằng 80.5
Chi phí nhân công 120.3
Chi nhánh Đà Nẵng
90.5 85.2 95.3 88.8
3
Tiền thuê mặt bằng 50.5
Chi phí nhân công 80.2
Chi phí marketing 25.5
Chi nhánh Sài Gòn
200.5 180.2 190.3 210.8
3
Tiền thuê mặt bằng 150.5
Chi phí nhân công 180.2
Chi phí vận hành 100.5
Output:
985.2
Chi nhánh Hà Nội 431.0
0
Chi nhánh Hà Nội 431.0
Chi nhánh Sài Gòn 350.6
Chi nhánh Đà Nẵng 203.6
Hướng dẫn giải:
- Nhập số lượng chi nhánh
n
. - Với mỗi chi nhánh:
- Nhập tên, 4 doanh thu quý → tính tổng doanh thu
- Nhập
k
chi phí → tính tổng chi phí - Tính lợi nhuận = doanh thu - chi phí
- Lưu thông tin từng chi nhánh: (tên, doanh thu, chi phí, lợi nhuận)
- Tính tổng lợi nhuận tất cả chi nhánh
- Tìm chi nhánh có lợi nhuận lớn nhất
- Đếm số chi nhánh có lợi nhuận âm
- Sắp xếp danh sách chi nhánh theo yêu cầu
Code Python:
n = int(input())
chinhanh_list = []
for _ in range(n):
ten = input()
doanhthu_quy = list(map(float, input().split()))
tong_doanh_thu = sum(doanhthu_quy)
k = int(input())
tong_chi_phi = 0.0
for _ in range(k):
parts = input().rsplit(' ', 1)
so_tien = float(parts[-1])
tong_chi_phi += so_tien
loinhuan = round(tong_doanh_thu - tong_chi_phi, 1)
chinhanh_list.append({
'ten': ten,
'doanhthu': tong_doanh_thu,
'chiphi': tong_chi_phi,
'loinhuan': loinhuan
})
# Tính tổng lợi nhuận hệ thống
tong_loinhuan = round(sum(c['loinhuan'] for c in chinhanh_list), 1)
# Tìm chi nhánh có lợi nhuận cao nhất
max_chi_nhanh = max(chinhanh_list, key=lambda c: c['loinhuan'])
# Đếm chi nhánh lỗ
so_lo = sum(1 for c in chinhanh_list if c['loinhuan'] < 0)
# Sắp xếp danh sách chi nhánh
sorted_list = sorted(
chinhanh_list,
key=lambda c: (-c['loinhuan'], -c['doanhthu'], c['ten'])
)
# In kết quả
print(tong_loinhuan)
print(f"{max_chi_nhanh['ten']} {max_chi_nhanh['loinhuan']}")
print(so_lo)
for c in sorted_list:
print(f"{c['ten']} {c['loinhuan']}")
Comments