所以我在 Stack Overflow 用戶的幫助下寫了這段代碼,這里是......
def letter_total(filename: str):
chars = list(filename)
chars_unique = set(chars)
chars_unique.remove(' ')
result = []
for x in chars_unique:
result.append([x, chars.count(x)*('*')])
return result
def letter_count(filename: str):
l_count = letter_total(filename)
for c in sorted(l_count):
print(c[0], c[1])
print(letter_count(filename='How was your day'))
這是結果輸出......
H *
a **
d *
o **
r *
s *
u *
w **
y **
None
但我希望我的輸出按從大多數*到最少的順序列印。(如果兩個不同字母中有相同數量的“*”,那么我希望它按字母順序回傳這兩個字母)
somy 輸出應該是這樣的
a **
o **
w **
y **
d *
H *
r *
s *
如何在不使用 key = lamda 且僅使用 sorted() 的情況下完成此操作?
uj5u.com熱心網友回復:
您要求不使用螺絲刀而只用裸露的手指擰入螺絲,但沒關系。
如果您將每個計數存盤為串列[negative_count, letter]而不是[letter, stars],則默認排序將首先按negative_count(更長的優先)排序并letter用作決勝局,完全符合您的預期。請注意,大寫字母排在小寫字母之前。
對您的代碼進行最少的更改:
def letter_total(filename: str):
chars = list(filename)
chars_unique = set(chars)
chars_unique.remove(' ')
result = []
for x in chars_unique:
result.append([-chars.count(x), x])
return result
def letter_count(filename: str):
l_count = letter_total(filename)
for c in sorted(l_count):
print(c[1], (-c[0]) * '*')
print(letter_count(filename='How was your day'))
然后還有幾個指標:
letter_count已經在進行印刷;無需也列印其回傳值(即None)。(stars, letter)在這里使用元組而不是串列更有效和更慣用。- 這段代碼是 O(n2),這意味著它效率很低。對于每個唯一的字母,它會遍歷整個字串以僅計算該字母。運行一次字串并在
dict. 然后作為最后一步,將 轉換dict為元組串列。
把所有這些放在一起:
def letter_total(filename: str):
l_count = {}
for x in filename:
if x != ' ':
if x not in l_count:
l_count[x] = 0
l_count[x] -= 1
result = [(count, letter) for letter, count in l_count.items()]
return result
def letter_count(filename: str):
l_count = letter_total(filename)
for c in sorted(l_count):
print(c[1], (-c[0]) * '*')
print(letter_count(filename='How was your day'))
我知道您只是在學習,但在生產代碼中,我建議您使用collections.Counter哪種方式來完成這項作業:
>>> from collections import Counter
>>> list(Counter('How was your day').items())
[(' ', 3), ('H', 1), ('a', 2), ('d', 1), ('o', 2), ('r', 1), ('s', 1), ('u', 1), ('w', 2), ('y', 2)]
uj5u.com熱心網友回復:
清理輸入字串
然后使用 Counter 及其方法 most_common 獲取按出現次數計算的字母串列
然后按第二個元素對元組 l 的輸出串列進行分組
申請排序
from collections import Counter
from typing import List, Tuple
s: str = 'How was your day'.replace(" ", "")
ll: List[Tuple[str, int]] = Counter(s).most_common()
res = sum([sorted(v, key=lambda ch: ch[0].lower()) for k,v in groupby(ll), lambda x: x[1])], [])
res = [(x, y * "*") for x,y in res]
輸出:
[('a', '**'),
('o', '**'),
('w', '**'),
('y', '**'),
('d', '*'),
('H', '*'),
('r', '*'),
('s', '*'),
('u', '*')]
uj5u.com熱心網友回復:
這邊走:
sorted(sorted(l_count), key = lambda i:-i[1])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/360843.html
