171

我正在尝试通过索引访问 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

我怎样才能做到这一点?

4

6 回答 6

239

改为调用list()字典:

keys = list(test)

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

>>> test = {'foo': 'bar', 'hello': 'world'}
>>> list(test)
['foo', 'hello']
>>> list(test)[0]
'foo'
于 2013-08-31T19:33:10.787 回答
72

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

next(iter(q))

list(q)[0]

对于大型字典,因为不必将整个内容存储在内存中。

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

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

于 2014-12-24T14:59:20.367 回答
6

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

 key, val = next(iter(my_dict.items()))
于 2020-03-29T19:30:22.510 回答
5

蟒蛇 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']

另请参阅此详细答案

于 2021-02-08T20:56:55.750 回答
0

在许多情况下,这可能是一个XY 问题。为什么要按位置索引字典键?你真的需要吗?直到最近,在 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按索引访问元素,请仔细查看您的代码。也许你不需要。

于 2019-05-29T12:31:57.913 回答
0
test = {'foo': 'bar', 'hello': 'world'}
ls = []
for key in test.keys():
    ls.append(key)
print(ls[0])

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

于 2019-02-21T13:25:51.927 回答