我需要帮助来排列内部有2个键的列表。例如,如果我输入“google”,则输出应如下所示:
Letter: 'g', Frequency: 2
Letter: 'o', Frequency: 2
Letter: 'e', Frequency: 1
Letter: 'l', Frequency: 1
但相反,我得到的是:
Letter: 'e', Frequency: 1
Letter: 'g', Frequency: 2
Letter: 'l', Frequency: 1
Letter: 'o', Frequency: 2
基本上它只是对字母而不是频率进行排序。我想要的是先按频率按字母排序然后按字母排序。这是我的排序部分的代码片段和字典样本声明:
adict = {'Letter':'a', 'Frequency':0}
bdict = {'Letter':'b', 'Frequency':0}
cdict = {'Letter':'c', 'Frequency':0}
def getKey(item):
return item['Frequency']
finalArr = sorted(newArr, key = getKey)
我已经尝试了lambda排序和itemgetter,但它仍然对这封信进行排序。
这是频率更新部分(不是整个部分只是一个样本):
for ex in range(0, len(temp)):
if temp[count] == 'a': adict['Frequency']+=1
elif temp[count] == 'b': bdict['Frequency']+=1
elif temp[count] == 'c': cdict['Frequency']+=1
如果频率不为0,则会将其分配给列表:
if adict['Frequency'] != 0 : newArr.append(adict)
if bdict['Frequency'] != 0 : newArr.append(bdict)
if cdict['Frequency'] != 0 : newArr.append(cdict)
答案 0 :(得分:1)
您可以从关键功能返回一个元组:
def getKey(item):
return (item['Frequency'], item['Letter'])
答案 1 :(得分:0)
对于小功能,您可以使用lambda
功能。这样可以避免代码堵塞。:
l = [
{'Letter': 'o', 'Frequency': 2},
{'Letter': 'e', 'Frequency': 1}]
print sorted(l, key=lambda x: [x['Frequency'], x['Letter']])
对于降序使用reverse
:
print sorted(l, key=lambda x: [x['Frequency'], x['Letter']], reverse=True)
答案 2 :(得分:0)
如果您不介意使用Counter
标准库中的collections
类,那么代码会更简单一些:
from collections import Counter
string_input = 'google'
counter = Counter(string_input)
for letter, frequency in counter.most_common():
print 'Letter: {!r}, Frequency: {}'.format(letter, frequency)
这种方法唯一的问题是字母没有排序,所以输出可能如下所示:
Letter: 'o', Frequency: 2
Letter: 'g', Frequency: 2
Letter: 'e', Frequency: 1
Letter: 'l', Frequency: 1