按值排序打印字典

38

我基本上想要遍历一个字典并按从最大值到最小值的顺序打印出键/值。我已经在搜索这个网站,很多人都使用lambda,但我不太确定它是如何工作的,所以现在我试图避免使用它。

dictIterator = iter(sorted(bigramDict.iteritems()))
for ngram, value in dictIterator:
    print("There are " + str(value) + " " + ngram)

看了上面的代码,我以为它会产生一个迭代器,按从最大到最小的顺序返回键/值对,但实际情况并非如此。

有人能看出问题是什么吗?或者有其他方法可以做到这一点吗?


1
请看这个链接:https://dev59.com/EHRB5IYBdhLWcg3weHLx - Alex Emelin
5个回答

35

可以利用排序函数对元组进行排序,将第一个元素视为比第二个元素更重要的因素:

d = { "a":4, "c":3, "b":12 }
d_view = [ (v,k) for k,v in d.iteritems() ]
d_view.sort(reverse=True) # natively sort tuples by first element
for v,k in d_view:
    print "%s: %d" % (k,v)

输出:

b: 12
a: 4
c: 3

编辑:一行代码,生成器表达式:

sorted( ((v,k) for k,v in d.iteritems()), reverse=True)

输出:

[(12, 'b'), (4, 'a'), (3, 'c')]

18
Python 3 的一行代码: sorted( ((v,k) for k,v in d.items()), reverse=True) - tegan

25
你可以使用`sorted`的`key`参数来按第二个元素进行排序:
>>> d = { "a":4, "c":3, "b":12 }
>>> from operator import itemgetter
>>> for k, v in sorted(d.items(), key=itemgetter(1)):
    print k, v


c 3
a 4
b 12
>>> 

编辑:一行代码,按相反顺序执行:

>>> d = {"a": 4, "c": 3, "b": 12}
>>> [(k, v) for k, v in sorted(d.items(), key=lambda x: x[1], reverse=True)]
[('b', 12), ('a', 4), ('c', 3)]
>>> 

这些排序方式相反。请注意编辑以颠倒顺序(从大到小排序)?谢谢! - Ward W

4
>>> d = { "a":4, "c":3, "b":12 }
>>> from operator import itemgetter
>>> lst = sorted(d.iteritems(), key=itemgetter(1))
>>> for t in lst: print '%s : %d' % (t[0], t[1])
... 
c : 3
a : 4
b : 12

3
以下是一份使用Python 3的解决方案:
d = { "a":4, "c":3, "b":12 }
sorted(((v, k) for k, v in d.items()), reverse=True)

0
d = { "a":4, "c":3, "b":12 }
for v in sorted( d.values() ):
    for key in d:
        if d[ key ] == v:
            print key, v
            break

这个可以工作,但是它会在整个字典上循环X次,其中X是字典的长度。这可能会浪费资源。 - Jean Coiron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接