【问题标题】:Last Key in Python DictionaryPython字典中的最后一个键
【发布时间】:2013-04-14 01:31:16
【问题描述】:

我很难弄清楚 Python 字典中最后一个键的语法是什么。我知道对于 Python 列表,人们可能会这样说来表示最后一个:

list[-1]

我也知道可以得到一个字典的键列表,如下所示:

dict.keys()

但是,当我尝试使用以下逻辑代码时,它不起作用:

dict.keys(-1)

它说键不能接受任何参数,并且给出了 1。如果键不能带参数,那么我如何表示我想要列表中的最后一个键?

我的操作假设 Python 字典是按照项目添加到字典中的顺序排序的,最近的项目最后。因此,我想访问字典中的最后一个键。

现在有人告诉我,字典键的顺序不是基于添加时间的。那么我如何才能选择最近添加的密钥呢?

【问题讨论】:

  • 字典中没有“最后一个”键,就像没有“第一个”键一样。
  • 为什么要最后一个键? Python 字典没有排序。
  • list(-1) 不是您获取列表中最后一个元素的方式...这会给您一个错误(您正在尝试调用列表)。我想你的意思是list[-1]

标签: python python-2.7


【解决方案1】:

您似乎想这样做:

dict.keys()[-1]

dict.keys() 返回字典键的列表。获得列表后,-1 索引允许您获取列表的最后一个元素。

由于字典是无序的*,因此获取字典的最后一个键是没有意义的。

也许您想先对它们进行排序。它看起来像这样:

sorted(dict.keys())[-1]

注意:

在 Python 3 中,代码是

list(dict)[-1]

*更新:

现在已经不是这样了。字典键从 Python 3.7 开始正式订购(在 3.6 中非正式订购)。

【讨论】:

  • 只是对 dict.keys()[-1] 的评论 这适用于 Python 2.7*,但不适用于 Python 3。Python 3 会报错:TypeError: 'dict_keys' object does not support indexing
  • 在 Python3 中它对我有用:list(dict.keys())[-1]
  • 值得注意的是,字典键是从 Python 3.7 开始正式排序的(在 3.6 中是非正式的)。
  • @abe 您实际上可以进一步缩短它:[*dict.keys()][-1]
【解决方案2】:

如果广告订单很重要,请查看collections.OrderedDict

OrderedDict 是一个 dict,它记住第一次插入键的顺序。如果新条目覆盖现有条目,则原始插入位置保持不变。删除条目并重新插入会将其移至末尾。


In [1]: from collections import OrderedDict

In [2]: od = OrderedDict(zip('bar','foo'))

In [3]: od
Out[3]: OrderedDict([('b', 'f'), ('a', 'o'), ('r', 'o')])

In [4]: od.keys()[-1]
Out[4]: 'r'

In [5]: od.popitem() # also removes the last item
Out[5]: ('r', 'o')

更新:

OrderedDict 不再是必需的,因为字典键从 Python 3.7 开始按插入顺序正式排序(在 3.6 中是非正式的)。

对于这些最新的 Python 版本,您可以改用 list(my_dict)[-1]list(my_dict.keys())[-1]

【讨论】:

  • 我在执行od.keys()[-1] 时得到TypeError: 'odict_keys' object does not support indexing。使用 Python 3.6.1。
  • 对于python 3 使用list(od.keys())[-1]
【解决方案3】:

查询字典中的“最后一个”键是没有意义的,因为字典键是无序的。您可以获取键列表并根据需要获取最后一个键,但这绝不是“字典中的最后一个键”。

【讨论】:

  • 那么字典会自动按照编辑的顺序排列,所以为了访问最近的键,我需要访问最后一个或最近添加的键。
  • 不,绝对不是!字典不会按照您编辑它的顺序。这是一个任意顺序,取决于键的哈希值。
  • 更新问题以弥补之前的知识不足。
  • @cbbcbail You edit 问“那我怎样才能选择最近添加的密钥?” 答案仍然是你不能——这些信息根本不是' t 存储在dict 中。您需要使用另一个数据结构(例如 OrderedDict),或者只是手动将变量保留在最后添加的值周围。
  • 谢谢,订购 dict 就可以了!我会删除我的问题。
【解决方案4】:

在 python 3.6 中,我从以下代码中获取了最后一个键的值

list(dict.keys())[-1]

【讨论】:

  • 不要在 Python 2.X 和旧版本的 Python 3.X 中这样做!!
【解决方案5】:

由于 python 3.7 dict 总是有序的(插入顺序),

由于python 3.8的keys()values()items()的dict返回:视图可以是reversed

获取最后一个密钥

next(reversed(my_dict.keys()))  

同样适用于values()items()

PS,要获取第一个密钥,请使用: next(iter(my_dict.keys()))

【讨论】:

  • 我发现这明显更快。例如。 5.7 秒 vs. 0.19 秒 range(1000) 默认 timeit
  • 荣誉。这就是我一直在寻找的。 list(dict.values())[-1] 正在以最差的表现击中自己的脚!如果我想这样做,我会在开头使用列表而不是字典。
【解决方案6】:
sorted(dict.keys())[-1]

否则keys只是一个无序列表,“最后一个”是没有意义的,甚至在各种python版本上都可以不同。

也许你想看看OrderedDict

【讨论】:

  • 只可惜​​他不支持“字符串”
【解决方案7】:

绝对有充分的理由需要 OrderedDict 的最后一个键。我在编辑用户时使用有序字典列出我的用户。我正在使用 AJAX 调用来更新用户权限并添加新用户。由于在检查权限时会触发 AJAX,因此为了方便起见,我希望我的新用户保持在显示列表中的相同位置(最后一个),直到我重新加载页面。每次脚本运行时,它都会重新排序用户字典。

这很好,为什么需要最后一个条目?因此,当我为我的软件编写单元测试时,我想确认用户保持在最后一个位置,直到页面重新加载。

dict.keys()[-1]

完美执行此功能(Python 2.7)。

【讨论】:

    【解决方案8】:

    肯定需要获取字典的最后一个元素,例如确认最新的元素是否已附加到字典对象。

    我们需要将字典键转换为列表对象,并使用-1的索引来打印出最后一个元素。

    mydict = {'John':'apple','Mat':'orange','Jane':'guava','Kim':'apple','Kate': 'grapes'}
    
    mydict.keys()
    

    输出:dict_keys(['John', 'Mat', 'Jane', 'Kim', 'Kate'])

    list(mydict.keys())
    

    输出:['John', 'Mat', 'Jane', 'Kim', 'Kate']

    list(mydict.keys())[-1]
    

    输出:“凯特”

    【讨论】:

      【解决方案9】:

      这将返回字典的最后一个元素:

      dictObj[len(dictObj.keys()) - 1]
      

      【讨论】:

        【解决方案10】:

        你可以这样做:

        def getLastItem(dictionary):
            last_keyval = dictionary.popitem()
            dictionary.update({last_keyval[0]:last_keyval[1]})
            return {last_keyval[0]:last_keyval[1]}
        

        这不会改变原来的字典! 发生这种情况是因为 popitem() 函数返回一个元组,我们可以利用它为我们提供帮助!!

        【讨论】:

          【解决方案11】:
          #to find last key:
          
          dict = {'a':1,'b':2,'c':3,'d':4}
          print(dict)
          
          res = list(dict.key())[-1]
          print(res)
          
          #to find last value:
          
          dict = {'a':1,'b':2,'c':3,'d':4}
          print(dict)
          
          res = list(dict.values())[-1]
          print(res)
          

          【讨论】:

            【解决方案12】:

            是的,有:len(data)-1

            对于第一个元素,它是:0

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-01-19
              • 2017-01-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-10-18
              • 1970-01-01
              相关资源
              最近更新 更多