【问题标题】:Sorting a list based on the 2nd key根据第二个键对列表进行排序
【发布时间】:2016-05-06 14:05:44
【问题描述】:

我需要帮助来对包含 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

基本上它只是对字母进行排序,而不是对频率进行排序。我想要的是先按频率排序,然后按字母排序。这是我的排序部分的代码 sn-p 和字典示例声明:

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)

【问题讨论】:

  • 所有频率都具有相同的值,那怎么办?您的示例不完整,请添加 newArr var 的值。
  • 一个有两个键的列表是一个字典。 Dict 是一种未排序的数据类型。你的代码中的 newArr 是什么,它是一个字典列表吗?需要更多代码/更好的例子。
  • 我已经更新了我的帖子 Avinash,是的,@kingledion newArr 基本上是一个字典列表

标签: python sorting python-3.x


【解决方案1】:

你可以从你的键函数中返回一个元组:

def getKey(item):
    return (item['Frequency'], item['Letter'])

【讨论】:

    【解决方案2】:

    对于小函数,您可以使用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)
    

    【讨论】:

      【解决方案3】:

      如果您不介意使用来自collections 标准库的Counter 类,那么代码会简单一些:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-23
        • 1970-01-01
        • 2014-11-29
        • 2011-05-21
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        相关资源
        最近更新 更多