在Python3中按索引访问dict_keys元素

fj1*_*23x 107 python dictionary key python-3.x

我正在尝试通过索引访问dict_key的元素:

test = {'foo': 'bar', 'hello': 'world'}
keys = test.keys()  # dict_keys object

keys.index(0)
AttributeError: 'dict_keys' object has no attribute 'index'
Run Code Online (Sandbox Code Playgroud)

我想得到foo.

同样的:

keys[0]
TypeError: 'dict_keys' object does not support indexing
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Mar*_*ers 125

请拨打list()字典:

keys = list(test)
Run Code Online (Sandbox Code Playgroud)

在Python 3中,该dict.keys()方法返回一个字典视图对象,它充当一个集合.直接迭代字典也会生成键,因此将字典转换为列表会生成所有键的列表:

>>> test = {'foo': 'bar', 'hello': 'world'}
>>> list(test)
['foo', 'hello']
>>> list(test)[0]
'foo'
Run Code Online (Sandbox Code Playgroud)

  • [在Python 3中注意列表(dict.keys()) - Labix Blog](http://blog.labix.org/2008/06/27/watch-out-for-listdictkeys-in-python-3)没有提供解决方案,清楚地解释了问题所在.这太棒了! (2认同)
  • @GoodWill:sorted(dict)会做完全相同的事情;按排序顺序生成键列表。`list(dict)`将以字典顺序给出列表。 (2认同)

Mar*_*ark 46

不完整的答案,但也许是一个有用的提示.如果它真的是你想要的第一个项目*,那么

next(iter(q))
Run Code Online (Sandbox Code Playgroud)

比...快得多

list(q)[0]
Run Code Online (Sandbox Code Playgroud)

对于大型dicts,因为整个事情不必存储在内存中.

对于10.000.000项,我发现它快了近40.000倍.

*在Python 3.6之前,dict只是一个伪随机项的第一项(之后它在标准实现中被排序,虽然它不建议依赖它).

  • 在Py3中,一切都变成迭代器,这一直是我最大的问题之一。它肯定更有效,但是有许多用例无缘无故变得“不干净”且复杂。例如,为什么他们不能仅在迭代器上支持索引,而不必造成性能损失? (2认同)

woo*_*odz 15

蟒蛇3

mydict = {'a': 'one', 'b': 'two', 'c': 'three'}
mykeys = [*mydict]          #list of keys
myvals = [*mydict.values()] #list of values

print(mykeys)
print(myvals)
Run Code Online (Sandbox Code Playgroud)

输出

['a', 'b', 'c']
['one', 'two', 'three']
Run Code Online (Sandbox Code Playgroud)

另请参阅此详细答案


She*_*hid 6

我想要第一个字典项的“键”和“值”对。我使用了以下代码。

 key, val = next(iter(my_dict.items()))
Run Code Online (Sandbox Code Playgroud)