所以我有算法问题。 假设,我们有一个单词,单词中的所有字母必须按其出现频率排序,从最常见的开始。 例如。 “假设”看起来像“ppSsuoe”或“Ssppoeu”等等
我认为我应该在列表中添加单词,找到相同的字母,计算我有多少相同的字母并将其附加到列表的开头,只匹配的字母可以随机打印。
但是在将词汇附加到列表后,我不知道该怎么办。 如何找到相同的字母?如何对它们进行排序并附加到单词的开头?我应该使用临时名单吗?或者我应该使用key:value dictionary?
name = 'Suppose'
list = []
for letter in name:
list.append(letter)
答案 0 :(得分:1)
首先,我们将输入转换为字典,通过Counter
计算每个项目。接下来,我们使用sorted
将字典排序为我们想要的顺序(从最大到最小)。最后,我们遍历字典,将我们的项目添加回字符串形式,因此p:2
变成pp
。之后,我们通过join
将所有项目合并为一个字符串。
from collections import Counter
name = 'Suppose'
results = Counter(name)
print("".join([k * results[k] for k in sorted(results, key=lambda a: results[a], reverse = True)]))
答案 1 :(得分:1)
您可以使用Collection
,然后使用适当的排序:
>>> from collections import Counter
>>> f = Counter("Suppose")
>>> ''.join(k*v for k,v in sorted(f.items(), reverse = True,key = lambda p:p[1]))
'ppuSseo'
但请注意,此方法未指定具有相同频率的字母的最终顺序。在这里,唯一可以保证的是,在频率较低之前会出现更频繁的字母。如果你想要,例如相同频率的字母本身按字母顺序排序,您需要一个不同的key
参数。
答案 2 :(得分:1)
from collections import OrderedDict
name = 'Suppose'
my_dictionary = dict()
for letter in name.lower():
if letter in my_dictionary.keys():
my_dictionary[letter] += 1
else:
my_dictionary[letter] = 1
my_dictionary = OrderedDict(sorted(my_dictionary.items(), key=lambda x:x[1], reverse=True))
new_word = str()
for key, value in my_dictionary.items():
new_word += (value*key)
print (new_word)
我这样做的方法是先创建一个带字母键的字典,然后计算出现次数。不要忘记使用name.lower()来首先对单词进行资本化。然后,按降序对值进行排序。最后,创建一个新字符串并向其添加键*值
答案 3 :(得分:0)
string='suppose'
counts=[0]*26 #initialize a 26-sized array for each alphabet
for letter in string:
counts[ord(letter.lower())-97]+=1 #for each alphabet in the string update the count
greatest=0 #initialize largest count to 0
for count in counts: #look for each alphabet count
if count>greatest:greatest=count #update the greatest count
while greatest: #while greatest doesn't equal to 0
for i in range(len(counts)): #look up all counts
if counts[i]==greatest: print(end=chr(i+97)*greatest) #the current alphabet has greatest count(as of yet) so print it 'greatest' times, the end is kept to skip newline
greatest-=1 #update greatest count
print() #newline feed