2

我有一个 2d 字典,其中我的数据如下所示:

k1,k2, value
 1,2,0.8
 1,3,0.7
 1,5,0.9
 2,1,0.8

  and so on

所以可以说我在二维字典中有这些数据..

d[1][2] --> gives 0.8

我想要的是根据值对每个 k1 的 k2 进行反向排序

所以对于上面..我希望在这个操作之后得到的是:

1,5,0.9
1,2,0.8
1,3,0.7
2,1,0.8

等等..

我如何在python中实现上述目标

4

2 回答 2

2

k2这对 each 进行反向排序k1,这是您的问题所要求的:

for k1, subdict in maindict.items():
    for k2, value in sorted(subdict.items(), reverse=True):
        print(k1, k2, value)

如果您还想向前排序k1

for k1, subdict in sorted(maindict.items()):
    for k2, value in sorted(subdict.items(), reverse=True):
        print(k1, k2, value)

如果你想反向排序value而不是k2(正如你的标题所要求的那样):

for k1, subdict in maindict.items():
    for k2, value in sorted(subdict.items(), key=lambda (k, v): v, reverse=True):
        print(k1, k2, value)

一些解释:

您可以调用sorted任何序列来获取它的排序版本。您可以传递reverse=True给几乎任何与排序相关的函数以对其进行反向排序,并key指定一个从每个值生成排序键的函数。有关详细信息,请参阅排序方法。

lambda上面给出的函数仅适用于 Python 2.x。在 3.x 中,您可以使用lambda kv: kv[1]。或者您可以只使用operator.itemgetter(1)。)

items您可以通过调用其方法从任何映射中获取一系列键值对。在 Python 3.x 中,这为您提供了一个很好的高效视图;在 2.x 中,它将对复制到list.

最后,请记住 adict没有固有的顺序。

于 2013-04-19T19:19:00.927 回答
1

dict 的要点是它是无序的。如果你想从你的字典中创建一个新的值列表,并对这些值进行排序,那是另一回事。但是你不会得到一个已经排序的字典(除非你让自己成为一个排序的字典,这实际上并不难)。

于 2013-04-19T19:51:27.860 回答