在Python中,如何获取下一个和上一个键:字典中特定键的值?

Bre*_*wer 15 python dictionary key

好的,所以这有点难以解释,但这里有:

我有一本字典,我正在添加内容.内容是带有IP地址(值)的哈希用户名(密钥).我通过在基数16上运行它们然后使用Collection.orderedDict将哈希放入一个顺序.所以,字典看起来有点像这样:

d = {'1234': '8.8.8.8', '2345':'0.0.0.0', '3213':'4.4.4.4', '4523':'1.1.1.1', '7654':'1.3.3.7', '9999':'127.0.0.1'}
Run Code Online (Sandbox Code Playgroud)

我需要的是一种机制,允许我选择其中一个键,并使键/值项目更高,更低一个.所以,例如,如果我选择2345,代码将返回键:值组合'1234:8.8.8.8'和'3213:4.4.4.4'

所以,像:

for i in d:
  while i < len(d)
   if i == '2345':
     print i.nextItem
     print i.previousItem
     break()
Run Code Online (Sandbox Code Playgroud)

Ada*_*erz 8

编辑: OP 现在声明他们正在使用 OrderedDicts,但用例仍然需要这种方法。

由于 dicts 不是有序的,因此您不能直接执行此操作。从您的示例中,您正在尝试像使用链接列表一样引用该项目。

一个快速的解决方案是提取键并对它们进行排序,然后迭代该列表:

keyList=sorted(d.keys())
for i,v in enumerate(keyList):
    if v=='eeee':
        print d[keyList[i+1]]
        print d[keyList[i-1]]
Run Code Online (Sandbox Code Playgroud)

keyList握着你的项目的顺序,你必须回去吧,找出一个/上一个关键是要获得下一个/前值是什么。您还必须检查 i+1 是否大于列表长度以及 i-1 是否小于 0。

您可以类似地使用 OrderedDict,但我相信您仍然必须使用单独的列表执行上述操作,因为 OrderedDict 没有 next/prev 方法。


jam*_*lak 6

OrderedDict源代码中所示,如果您有一个密钥,并且您想在 O(1) 中找到下一个和上一个,您可以这样做。

>>> from collections import OrderedDict
>>> d = OrderedDict([('aaaa', 'a',), ('bbbb', 'b'), ('cccc', 'c'), ('dddd', 'd'), ('eeee', 'e'), ('ffff', 'f')])
>>> i = 'eeee'
>>> link_prev, link_next, key = d._OrderedDict__map['eeee']
>>> print 'nextKey: ', link_next[2], 'prevKey: ', link_prev[2]
nextKey:  ffff prevKey:  dddd
Run Code Online (Sandbox Code Playgroud)

这将按插入顺序为您提供下一个和上一个。如果您以随机顺序添加项目,则只需按排序顺序跟踪您的项目。

  • 这不是一个好习惯 - __map 是一个私有属性,不能保证在不同版本或不同平台中存在或继续以相同的方式运行。 (5认同)