Tôi có một tệp văn bản trông như thế này:
Mike 5 7 9
Terry 3 7 4
Bước 8 2 3
Tôi đã viết chương trình sau
- Lấy dữ liệu từ tập tin văn bản
- Chia văn bản thành các cột cách nhau bằng dấu cách
- Sắp xếp điểm số sau mỗi tên theo thứ tự (thấp nhất đầu tiên, cao nhất cuối cùng)
- Tải tên mỗi người và số điểm cao nhất vào danh sách (scoreslist)
- Sắp xếp danh sách và xuất kết quả theo thứ tự bảng chữ cái
def theo thứ tự bảng chữ cái():
danh sách điểm = []
với open ("classa.txt") là f:
nội dung = f.read().splitlines()
cho dòng trong nội dung:
đường chia = line.split("")
tên = đường phân chia[0]
điểm = đường phân chia[1:]
điểm cao = đã sắp xếp(điểm)[-1]
Scorelist.append("{} {}".format(name,highscore))
danh sách điểm.sort(key=lambda x: x[0])
in (danh sách điểm)
Đầu ra cuối cùng trông như thế này:
Mike 9
bước 8
Terry 7
Tôi hài lòng với chức năng hiện tại nhưng tôi cảm thấy nó có thể sạch sẽ hơn một chút. Có cách nào dễ dàng hơn?
Quan trọng hơn, tôi muốn lấy tệp gốc và sử dụng phương pháp tương tự để tạo giá trị trung bình của các số trong tệp văn bản gốc và xuất ra ở cùng định dạng. Tôi nghĩ có thể có một hàm tính trung bình đơn giản mà tôi có thể sử dụng, nhưng điều này dường như không xảy ra:
điểm = chia dòng.avg[-1:-3]
Bạn có thể sử dụng thống kê.meanTính trung bình của bạn,csv lib phân tích tệp thành dòng, bạn không bao giờ cần gọi read
Trừ khi bạn thực sự muốn một chuỗi chứa tất cả nội dung tệp, bạn có thể lặp lại một đối tượng tệp và chia từng dòng.
từ số liệu thống kê nhập có nghĩa là
import csv
def Sort_mean(fle):
với open(fle) là f:
đối với tên, *điểm trong csv.reader(f, delimiter=" "):
srt = đã sắp xếp(map(int, điểm))
print("Điểm cao nhất cho {} là {}".format(name, srt[-1]))
print("Điểm trung bình của {} là {}".format(name,mean(srt)))
Đối với tệp đầu vào của bạn, nó sẽ xuất ra:
Điểm cao nhất của Mike là 9
Điểm trung bình của Mike là 7,0
Điểm cao nhất của Terry là 7
Điểm trung bình của Terry là 4.666666666666667
Điểm cao nhất ở Ste là 8
Điểm trung bình của Ste là 4.3333333333333333
Bây giờ nếu bạn muốn lưu trữ tất cả dữ liệu và xuất dữ liệu theo thứ tự:
từ số liệu thống kê nhập có nghĩa là
import csv
từ toán tử nhập itemgetter
def Sort_mean(fle):
trung bình, cao = [], []
với open(fle) là f:
đối với tên, *điểm trong csv.reader(f, delimiter=" "):
srt = danh sách (bản đồ (int, điểm))
avgs.append((tên, ý nghĩa(srt)))
high.append((name, max(srt)))
avgs.sort(key=itemgetter(1), Reverse=1)
high.sort(key=itemgetter(1), Reverse=1)
trả về mức trung bình, cao
Điều này sẽ cung cấp cho bạn hai danh sách được sắp xếp từ cao đến thấp:
Trong [10]: cao, avgs = Sort_mean("in.txt")
Trong [11]: cao
Ra[11]: [('Mike', 7.0), ('Terry', 4.666666666666667), ('Ste', 4.333333333333333)]
Trong [12]: trung bình
Ra[12]: [('Mike', 9), ('Ste', 8), ('Terry', 7)]
Đối với python2, bạn cần tự tính toán mức trung bình và logic của vòng lặp hơi khác một chút:
def Sort_mean(fle):
trung bình, cao = [], []
với open(fle) là f:
cho hàng trong csv.reader(f, delimiter=" "):
tên, điểm = hàng[0], hàng[1:]
srt = bản đồ(int, điểm số)
avgs.append((name, sum(srt,0.0) / len(srt)))
high.append((name, max(srt)))
avgs.sort(key=itemgetter(1), Reverse=1)
high.sort(key=itemgetter(1), Reverse=1)
trả về mức trung bình, cao
Thay vì hai danh sách, bạn có thể lưu trữ từ điển có điểm cao nhất của người dùng và sắp xếp các mục được lưu trữ trong đó.
Về chức năng của riêng bạn, bạn có thể viết lại nó như sau:
def theo thứ tự bảng chữ cái():
danh sách điểm = []
với open ("classa.txt") là f:
# chỉ lặp lại đối tượng file
# từng dòng một
cho dòng trong f:
# không cần vượt qua dấu phân cách
chia_line = line.split()
tên = chia_line[0]
điểm = chia_line[1:]
# sử dụng max để lấy điểm cao và sử dụng int làm khóa
# hoặc "123" < "2"
high_score = max(score,key=int)
Score_list.append("{} {}".format(name,high_score))
# không cần lambda để sắp xếp theo thứ tự abc
điểm_list.sort()
in(điểm_list)
Tôi là một lập trình viên xuất sắc, rất giỏi!