在Python3中按索引访问dict_keys元素

时间:2013-08-31 19:30:58

标签: python dictionary python-3.x key

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

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

keys.index(0)
AttributeError: 'dict_keys' object has no attribute 'index'

我想获得foo

同样:

keys[0]
TypeError: 'dict_keys' object does not support indexing

我该怎么做?

8 个答案:

答案 0 :(得分:107)

改为在词典上调用list()

keys = list(test)

在Python 3中,dict.keys()方法返回dictionary view object,它充当集合。直接迭代字典也会生成键,因此将字典转换为列表会生成所有键的列表:

>>> test = {'foo': 'bar', 'hello': 'world'}
>>> list(test)
['foo', 'hello']
>>> list(test)[0]
'foo'

答案 1 :(得分:44)

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

next(iter(q))

快得多
list(q)[0]

对于大型词汇,因为整个事情不必存储在内存中。

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

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

答案 2 :(得分:3)

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

 key, val = next(iter(my_dict.items()))

答案 3 :(得分:0)

test = {'foo': 'bar', 'hello': 'world'}
ls = []
for key in test.keys():
    ls.append(key)
print(ls[0])

将键附加到静态定义的列表然后对其进行索引的常规方法

答案 4 :(得分:0)

在许多情况下,这可能是XY Problem。为什么要按位置索引字典键?您真的需要吗?直到最近,字典甚至还没有在Python中排序,因此访问第一个元素是任意的。

我刚刚将一些Python 2代码转换为Python 3:

keys = d.keys()
for (i, res) in enumerate(some_list):
    k = keys[i]
    # ...

虽然不漂亮,但也不是很糟糕。起初,我要用可怕的东西代替它

    k = next(itertools.islice(iter(keys), i, None))

在我意识到这一切写得更好之前

for (k, res) in zip(d.keys(), some_list):

效果很好。

我相信在许多其他情况下,可以避免按位置索引字典关键字。尽管字典在Python 3.7中是有序的,但依靠它并不是很漂亮。上面的代码仅起作用,因为some_list的内容是最近从d的内容中产生的。

如果您确实需要按索引访问disk_keys元素,请仔细阅读代码。也许您不需要。

答案 5 :(得分:0)

尝试一下

keys = [next(iter(x.keys())) for x in test]
print(list(keys))

结果看起来像这样。 ['foo','hello']

您可以找到更多可能的解决方案here

答案 6 :(得分:0)

Python 3

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

print(mykeys)
print(myvals)

输出

['a', 'b', 'c']
['one', 'two', 'three']

另见此detailed answer

答案 7 :(得分:-2)

另一种不同的方法是使用像这样的pandas系列:

import pandas as pd
pd.Series(dict).index.values.tolist()

这可能是过大的杀伤力,而且速度不是很快,但是对我而言,它非常清晰易读。