42

我想通过 Python 字典中的键索引获取值。有没有办法得到这样的东西?

dic = {}
value_at_index = dic.ElementAt(index)

其中index是一个整数

4

4 回答 4

43

在 3.7 之前的 Python 版本中,字典本质上是无序的,所以你要求做的事情并没有真正的意义。

如果您真的,真的知道自己在做什么,请使用

value_at_index = list(dic.values())[index]

请记住,在 Python 3.7 之前,添加或删除一个元素可能会更改每个其他元素的索引。

于 2013-02-27T14:43:56.173 回答
14

让我们以字典为例:

numbers = {'first':0, 'second':1, 'third':3}

当我这样做的时候

numbers.values()[index]

我收到一个错误:'dict_values' 对象不支持索引

当我这样做的时候

numbers.itervalues()

迭代并提取它也会给出错误的值:'dict'对象没有属性'iteritems'

因此,我想出了通过索引访问字典元素的新方法,只需将它们转换为元组即可。

tuple(numbers.items())[key_index][value_index]

例如:

tuple(numbers.items())[0][0] gives 'first'

如果您想编辑值或对值进行排序,元组对象不允许项目分配。在这种情况下,您可以使用

list(list(numbers.items())[index])
于 2018-12-25T16:41:26.803 回答
9

如果您真的只想从可用键范围中获取随机值,请random.choice在字典的值上使用(如果 Python 3,则转换为列表形式)。

>>> from random import choice
>>> d = {1: 'a', 2: 'b', 3: 'c'}
>>>> choice(list(d.values()))
于 2013-02-27T22:03:40.040 回答
6

虽然你可以做

value = d.values()[index]

应该更快

value = next( v for i, v in enumerate(d.itervalues()) if i == index )

编辑:我只是使用 len 100,000,000 的字典在最后检查索引对其进行计时,第一个/values() 版本需要 169 秒,而第二个/next() 版本需要 32 秒。

另外,请注意,这假设您的索引不是负数

于 2015-07-24T21:49:43.867 回答