单词中的字母频率

时间:2017-04-08 12:13:02

标签: python algorithm python-3.x

所以我有算法问题。 假设,我们有一个单词,单词中的所有字母必须按其出现频率排序,从最常见的开始。 例如。 “假设”看起来像“ppSsuoe”或“Ssppoeu”等等

我认为我应该在列表中添加单词,找到相同的字母,计算我有多少相同的字母并将其附加到列表的开头,只匹配的字母可以随机打印。

但是在将词汇附加到列表后,我不知道该怎么办。 如何找到相同的字母?如何对它们进行排序并附加到单词的开头?我应该使用临时名单吗?或者我应该使用key:value dictionary?

name = 'Suppose'
list = []
for letter in name:    
    list.append(letter)

4 个答案:

答案 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