在python中排序元组

时间:2016-07-17 19:11:35

标签: python sorting tuples

我正在尝试从以下程序中获取已排序的输出。

"""Count words."""
    # TODO: Count the number of occurences of each word in s

    # TODO: Sort the occurences in descending order (alphabetically in case of ties)

    # TODO: Return the top n words as a list of tuples 


from operator import itemgetter
def count_words(s, n):
    """Return the n most frequently occuring words in s."""

    t1=[]
    t2=[]
    temp={}
    top_n={}

    words=s.split()
    for word in words:
        if word not in temp:
            t1.append(word)
            temp[word]=1
        else:
            temp[word]+=1
    top_n=sorted(temp.items(), key=itemgetter(1,0),reverse=True)

    print top_n

    return 


def test_run():
    """Test count_words() with some inputs."""
    count_words("cat bat mat cat bat cat", 3)
    count_words("betty bought a bit of butter but the butter was bitter", 3)


if __name__ == '__main__':
    test_run()

此程序输出如下:

[('cat', 3), ('bat', 2), ('mat', 1)]

[('butter', 2), ('was', 1), ('the', 1), ('of', 1), ('but', 1), ('bought', 1), ('bitter', 1), ('bit', 1), ('betty', 1), ('a', 1)]

但我需要的形式如下:

[('cat', 3), ('bat', 2), ('mat', 1)]

[('butter', 2), ('a', 1),('betty', 1),('bit', 1),('bitter', 1) ... rest of them here]

请你告诉我最好的方法吗?

4 个答案:

答案 0 :(得分:3)

您需要更改key给予sorted的功能,因为您需要的输出中的项目需要按计数降序排序,但按字母顺序按升序排序。我使用lambda函数:

top_n = sorted(temp.items(), key=lambda item: (-item[1], item[0]))

通过否定计数,升序排序可以获得所需的顺序。

答案 1 :(得分:0)

您可以更改:

top_n=sorted(temp.items(), key=itemgetter(1,0),reverse=True)

要:

temp2=sorted(temp.items(), key=itemgetter(0),reverse=False)
top_n=sorted(temp2.items(), key=itemgetter(1),reverse=True)

感谢Sort Stability你会很好

答案 2 :(得分:0)

而不是itemgetter,请使用lambda t:(-t[1],t[0])并删除reverse=True

top_n=sorted(temp.items(), key=lambda t:(-t[1],t[0]))

返回与itemgetter(1,0)相同的内容,只有第一个值被反转,以便在较低的数字之前对较高的数字进行排序。

答案 3 :(得分:0)

def count_words(s, n):
"""Return the n most frequently occuring words in s."""

    t1=[]
    t2=[]
    temp={}
    top_n={}

    words=s.split()
    for word in words:
        if word not in temp:
            t1.append(word)
            temp[word]=1
        else:
            temp[word]+=1
    top_n=sorted(temp.items(), key=lambda t: (t[1], t[0]),reverse=True)

    print top_n

    return 


def test_run():
"""Test count_words() with some inputs."""
    count_words("cat bat mat cat bat cat", 3)
    count_words("betty bought a bit of butter but the butter was bitter", 3)


if __name__ == '__main__':
    test_run() 

我使用了lambda而不是itemgetter,而在我写过的其他应用中,lambda似乎有效。