【问题标题】:sorted dict returns doesn't make sense / python排序的字典返回没有意义/python
【发布时间】:2017-07-28 20:38:25
【问题描述】:

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

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

【问题讨论】:

  • 请展示topkmerdict的样子
  • 请阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。
  • 我想你可以用一行来解决这个问题,给topkmerdict赋值,然后显示你期望的输出和你得到的。
  • @asiviero 我已经添加了 topkmerdict 和排序行返回的内容
  • @Prune 谢谢,我添加了它们。我期望的是有一个按值排序的数据结构,以便我可以获得具有最小值的元素

标签: python list sorting dictionary primary-key


【解决方案1】:

你写的返回一个字典的键列表,按键的第二个字符的值排序(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']

【讨论】:

    【解决方案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'
    

    【讨论】:

    • sorted(topkmerdict,key=topkmerdict.__getitem__) 做了我想要的。谢谢你的解释。
    【解决方案3】:

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

    key=lambda x: x[1]
    

    到:

    key=lambda x: x
    

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

    【讨论】:

    • 但这与不将 lambda 传递给 sorted() 相同
    猜你喜欢
    • 2018-07-08
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2019-02-27
    • 2012-08-15
    • 1970-01-01
    • 2013-05-01
    相关资源
    最近更新 更多