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