排序字典 returns 没有意义 / python

sorted dict returns doesn't make sense / python

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

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

你写的内容 returns 字典键的列表,按键的第二个字符的值排序(x[1] 挑出键的第二个字符 x) .

不清楚你想要什么。例如,如果您希望键按其关联的 排序,那么这里有一种方法可以做到这一点:

>>> 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']

I have a dictionary of keys (string) and values (integer). I am trying to sort these in place in ascending order so that I can get the smallest element.

您可以使用 __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'

我想你会通过改变看到有趣的结果:

key=lambda x: x[1]

至:

key=lambda x: x

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