OrderedDict中的最后一个元素

max*_*max 36 python ordereddictionary python-3.x

我有od类型OrderedDict.我想访问它最近添加的(键,值)对.od.popitem(last = True)会这样做,但也会删除od我不想要的那对.

有什么好办法呢?可以/应该这样做:

class MyOrderedDict(OrderedDict):
  def last(self):
    return next(reversed(self))
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 58

使用next(reversed(od))是访问最近添加的元素的完美方式.该类OrderedDict为字典项和实现使用双向链表__reversed__(),因此该实现为您提供了对所需元素的O(1)访问.是否值得OrderedDict()为这个简单的操作进行子类化可能会受到质疑,但这种方法并没有什么问题.

  • @hobs:是的,它只给你钥匙.如何获得给出密钥的价值留给读者作为练习.:) (19认同)
  • 另请注意,如果你想要*first*元素,你应该使用`next(iter(od))` (6认同)
  • FWIW,O(2)和O(1)是渐近等价的 (5认同)
  • 在Python 3.5中,您可以执行下一步(reverse(od.values()))以获取最后一个值 (4认同)
  • 难怪在 Python 3.5 中你可以执行 `next(reversed(od.items()))` 来获取最后一个 `(key, value)` 对。 (3认同)

Hub*_*iak 17

上帝,我希望这是所有内置功能......

这里有一些可以节省您宝贵时间的东西。在 Python 3.7 中测试。od是你的 OrderedDict。


# Get first key
next(iter(od))

# Get last key
next(reversed(od))

# Get first value
od[next(iter(od))]

# Get last value
od[next(reversed(od))]

# Get first key-value tuple
next(iter(od.items()))

# Get last key-value tuple
next(reversed(od.items()))
Run Code Online (Sandbox Code Playgroud)


mgi*_*son 15

来自timeit的一点点魔力可以帮到这里......

from collections import OrderedDict
class MyOrderedDict1(OrderedDict):
  def last(self):
    k=next(reversed(self))
    return (k,self[k])

class MyOrderedDict2(OrderedDict):
  def last(self):
     out=self.popitem()
     self[out[0]]=out[1]
     return out

class MyOrderedDict3(OrderedDict):
  def last(self):
     k=(list(self.keys()))[-1]
     return (k,self[k])

if __name__ == "__main__":
  from timeit import Timer

  N=100

  d1=MyOrderedDict1()
  for i in range(N): d1[i]=i

  print ("d1",d1.last())

  d2=MyOrderedDict2()
  for i in range(N): d2[i]=i

  print ("d2",d2.last())

  d3=MyOrderedDict3()
  for i in range(N): d3[i]=i

  print("d3",d3.last())



  t=Timer("d1.last()",'from __main__ import d1')
  print ("OrderedDict1",t.timeit())
  t=Timer("d2.last()",'from __main__ import d2')
  print ("OrderedDict2",t.timeit())
  t=Timer("d3.last()",'from __main__ import d3')
  print ("OrderedDict3",t.timeit())
Run Code Online (Sandbox Code Playgroud)

结果是:

d1 (99, 99)
d2 (99, 99)
d3 (99, 99)
OrderedDict1 1.159217119216919
OrderedDict2 3.3667118549346924
OrderedDict3 24.030261993408203
Run Code Online (Sandbox Code Playgroud)

(在python3.2上测试,Ubuntu Linux).

正如@SvenMarnach所指出的,与我烹饪的其他两种方法相比,您所描述的方法非常有效.