根据第二个键对列表进行排序

时间:2016-05-06 14:05:45

标签: python sorting python-3.x

我需要帮助来排列内部有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)

3 个答案:

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