Nhờ mọi người kiểm tra code của em

em đang tự học python và làm bài tập trên web quản trị mạng. Đề bài yêu cầu là: Viết chương trình tính tần suất các từ từ input. Output được xuất ra sau khi đã sắp xếp theo bảng chữ cái.
Và code mà web đấy soạn ra ở bài trong python 3.6.2 là như thế này:

freq = {} # frequency of words in text
line = input()
for word in line.split():
 freq[word] = freq.get(word,0)+1
words = sorted(freq.keys())
for w in words:
    print ("%s:%d" % (w,freq[w]))

giả sử đầu vào nhập vào là: dinh cong manh
thì em nghĩ đầu ra phải là: dinh:1
cong:1
manh:1 - là form kết quả mà web đấy bảo khi code như vậy. Nhưng khi em viết theo và chạy trên python 3.8.1 thì chương trình lại ra kết quả kiểu này:
dinh:1
cong:1
dinh:1
cong:1
dinh:1
manh:1
Vậy mọi người cho em hỏi liệu đây có phải là do thay đổi phiên bản mà chạy ra kết quả khác hay là code em viết bị sai ạ? Mong mọi người chỉ giáo giúp em

Đã sorted rồi thì làm sao ra vần d trước được, có gì sai sai ở đây.

2 Likes

Không biết mình có hiểu đúng yêu cầu đề bài không, nhưng theo mình hiểu thì mình sẽ làm như thế này (Python 3.7.3):

#my_string = 'dinh cong manh di duong bi dap dinh nen chay di den benh vien'
my_string = 'f x sssss a a a b b c c c d e'

my_list = my_string.split()
my_list.sort()
my_dict = {}

for item in my_list:
	# dùng hàm count() để đếm
	count_1_2_3 = my_list.count(item)
	# Add vô dict để print ra cho đẹp
	if item not in my_dict:
		my_dict.update({item:count_1_2_3})

print(my_dict)
exit()

{‘a’: 3, ‘b’: 2, ‘c’: 3, ‘d’: 1, ‘e’: 1, ‘f’: 1, ‘sssss’: 1, ‘x’: 1}
[Finished in 0.4s]

===

Đoạn code bạn viêt bên trên, mình chạy thử, thấy vẫn ra đúng mà:

line = 'f x sssss a a a b b c c c d e'
#line = 'dinh cong manh'

freq = {} # frequency of words in text

for word in line.split():
 freq[word] = freq.get(word,0)+1
words = sorted(freq.keys())
for w in words:
    print ("%s:%d" % (w,freq[w]))

a:3
b:2
c:3
d:1
e:1
f:1
sssss:1
x:1
[Finished in 0.5s]

cong:1
dinh:1
manh:1
[Finished in 0.5s]

1 Like

Tức là cứ mỗi từ là phải duyệt lại cái list đó một lần count_1_2_3 = my_list.count(item) (?!). Thớt làm vậy là ổn rồi.

1 Like

Đúng rồi. Loop nhiều lần như này thì sẽ chậm hơn.
Ở đây do bạn đó đang học, nên mình đặt cái readable code cao hơn là performance.

Làm duoc rồi, làm nhiều rồi thì họ sẽ chọn cách phù hợp hơn tốt hơn.

@baophuc2k: Link này có thể sẽ hữu ích cho cái bạn đang học:

2 Likes

em cảm ơn anh đã nhiệt tình chỉ bảo, chả hiểu kiểu gì hôm nay chạy lại nó lại đúng form ấy

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?