2012-07-24 49 views
13

可能重复:
Inverse dictionary lookup - Python
reverse mapping of dictionary with Python的Python:获得指标的关键在字典

我如何获得索引键的字典?

例如像:

i = {'a': 0, 'b': 1, 'c': 2} 

所以,如果我要得到我的钥匙[0],它会返回一个“

+0

要映射的*值*回到关键。 python字典中没有索引。 – 2012-07-24 14:21:56

+0

查看http://stackoverflow.com/questions/3221475/reverse-mapping-of-dictionary-with-python和http://stackoverflow.com/questions/483666/python-reverse-inverse-a-mapping – 2012-07-24 14:23:12

回答

5

根据定义字典是无序的,因此不能被索引。对于这种功能,使用有序的字典。 Python Ordered Dictionary

+0

'OrderedDict也不能被索引。 – Julian 2012-07-24 15:28:27

+0

确实如此,但是当调用dict.keys()或dict.values()时,订单被保留。所以这些列表上的索引对应于字典的“索引” – underbar 2012-07-24 15:31:59

17

Python字典有一个键和一个值,你问的是哪个键(S)指向给定值。

你只能这样做在一个循环:

[k for (k, v) in i.iteritems() if v == 0] 

注意,可以有每一个字典值超过一个关键; {'a': 0, 'b': 0}是完全合法的。

如果您想订购您可能需要使用列表或一个OrderedDict instance代替:

items = ['a', 'b', 'c'] 
items.index('a') # gives 0 
items[0]   # gives 'a' 
+1

不要以为这是他所要求的。他想用列表中的编号位置“索引” – 2012-07-24 14:27:42

+0

@PaulSeeb:我们猜测OP的含义是什么,让我们看看是否会有任何澄清。 – 2012-07-24 14:31:07

16

可以做这样的事情:

i={'foo':'bar', 'baz':'huh?'} 
keys=i.keys() #in python 3, you'll need `list(i.keys())` 
values=i.values() 
print keys[values.index("bar")] #'foo' 

但是,任何时候你改变字典,你需要更新你的钥匙,价值观,因为字典是没有顺序的。你插入一个新的键/值对的任何时间,您认为为了你有消失,并且由新的(或多或少随机的)顺序替换。因此,在字典中索引索引是没有意义的。

另外请注意,你所要求的是可能不是你真正想要的东西。不能保证字典中的逆映射是唯一的。换句话说,可能有以下字典你:

d={'i':1, 'j':1} 

在这种情况下,这是不可能知道你是否想ij,实际上这里没有答案就能告诉你这('i''j' )将被挑选(再次,因为字典是无序的)。你想在那种情况下发生什么?你可以得到可以接受的密钥列表...但我猜字典你的基本认识是不完全正确。

+0

我认为你的回答很具误导性。字典是无序的。你不应该发布一些工作来解决一些根本上无视编程逻辑的问题。 – 2012-07-24 14:30:39

+0

@PaulSeeb - 我已更新。这些帮助有用? – mgilson 2012-07-24 14:35:04

+0

@PaulSeeb - 你为什么认为我添加了“你所要求的可能不是你想要的”和“我猜你对字典的基本理解不是很正确”? – mgilson 2012-07-24 14:36:07

0

通过def。字典是键值对的无序集合。所以你不能有一个键值对的索引。您可以将它们保存在两个有序列表中,其索引值与键和值相同。然后,对于密钥列表中特定索引处的每个密钥,您可以从值列表中检索相关值。

或更好地使用有序字典。

d = OrderedDict([('first', 1), 

...( '第二',2), ...( '第三',3)])

入住这ordered list