【问题标题】:Accessing dictionary value by index in python [duplicate]在python中按索引访问字典值[重复]
【发布时间】:2013-02-13 10:08:27
【问题描述】:

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

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

index 是一个整数

【问题讨论】:

  • 这篇文章的后续访问者:按索引获取值:dic.values()[index] 按索引获取键:dic.keys()[index]

标签: python dictionary indexing


【解决方案1】:

在 3.7 之前的 Python 版本中,字典本质上是无序的,因此您要求执行的操作实际上没有意义。

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

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

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

【讨论】:

  • 虽然OrderedDict是可用的,如果你有能力改变原来的数据结构。
  • >> 添加或删除一个元素可能会改变所有其他元素的索引。是的,我知道,这是许多语言的许多迭代器的常识。
  • 是的,我真正想要的索引是在可用键范围内获取随机值,只是为了实现我的算法。
  • dic.values()[index] 我得到'dict_values'对象不支持索引.....? (python 3.6)
  • TypeError: 'dict_values' object is not subscriptable
【解决方案2】:

让我们以字典为例:

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

当我这样做时

numbers.values()[index]

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

当我这样做时

numbers.itervalues()

迭代并提取值也会出错:'dict' object has no attribute 'iteritems'

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

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

例如:

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

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

list(list(numbers.items())[index])

【讨论】:

  • 这与 python 3 完美配合,谢谢!
  • 当索引是字符串时不起作用...TypeError: list indices must be integers or slices, not str
【解决方案3】:

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

>>> from random import choice
>>> d = {1: 'a', 2: 'b', 3: 'c'}
>>>> choice(list(d.values()))

【讨论】:

    【解决方案4】:

    虽然你可以做

    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 秒。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2014-04-14
      • 2020-11-19
      • 2021-06-03
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多