排序的dict返回没有意义/ python

时间:2017-07-28 20:38:26

标签: python list sorting dictionary primary-key

我一直在调试我一直试图正常运行的程序,这一切都归结为第一行代码,如下所示。我有一个键(字符串)和值(整数)字典。我试图按升序对这些进行排序,以便我可以得到最小的元素。但是,返回值的顺序没有意义。它不会返回最小的第一个,事实上它返回最大的(尽管文档清楚地说它应该按升序排列)。即使第一个字符串是AAAAA..AAA,它也不是按字母顺序排列 - 但它不遵循字母顺序。我甚至不确定如何访问由sorted返回的元素以及它的类型。根据我在试验时收到的错误,它是一个"列表"。我怎么解决这个问题?这一行使得计算都错了。

    kmerMin = (sorted(topkmerdict,key=lambda x: x[1]))
    print kmerMin
    print kmerMin[0]
    print topkmerdict[kmerMin[0]]

3 个答案:

答案 0 :(得分:2)

你写的内容会返回一个dict键的列表,按键的第二个字符的值排序(x[1]选出键x的第二个字符)。< / p>

不清楚你想要的。例如,如果您希望按关联的排序密钥,那么这是一种方法:

>>> d = {"a": 12, "b": 6, "c": 3}
>>> sorted(d, key=lambda k: d[k])
['c', 'b', 'a']

另一种完全相同,更快但可能不太明显的方法:

>>> sorted(d, key=d.__getitem__)
['c', 'b', 'a']

答案 1 :(得分:2)

  

我有一个键(字符串)和值(整数)的字典。我试图按升序对这些进行排序,以便我可以得到最小的元素。

您可以使用__getitem__作为key-function来制作按值排序的键列表:

>>> topkmerdict = {
       'ATCCCAGCACTTTGGGAGGCCGAGGCAGGT': 6,
       'CTGTAATCCCAGCACTTTGGGAGGCCGAGG': 71,
       'AGCACTTTGGGAGGCCGAGGCAGGTGGATC': 8,
       'GGTGGCTCACGCCTGTAATCCCAGCACTTT': 53,
       'TGTTTGAGTTCATTGTAGATTCTGGATATT': 8,
       'CGGTGGCTCACGCCTGTAATCCCAGCACTT': 40,
       'GTAATCCCAGCACTTTGGGAGGCCGAGGCA': 27,
}
>>> kmerMin = sorted(topkmerdict, key=topkmerdict.__getitem__)
>>> kmerMin[0]
'ATCCCAGCACTTTGGGAGGCCGAGGCAGGT'
>>> topkmerdict[kmerMin[0]]
6

如果写 __ getitem __ 看起来太奇怪了,你仍然可以使用 lambda 作为关键函数:kmerMin = sorted(topkmerdict, key=lambda k: topkmerdict[k])

仅供参考,如果您想要的只是最小元素,则无需进行完整排序。 min()功能将更清晰,更清晰,更有效:

>>> min(topkmerdict, key=topkmerdict.__getitem__)
'ATCCCAGCACTTTGGGAGGCCGAGGCAGGT'

答案 2 :(得分:1)

我认为你会通过改变来看到有趣的结果:

key=lambda x: x[1]

到:

key=lambda x: x

这将根据整个键而不仅仅是第二个字符对键进行排序。