通过 Python 3中的索引访问 dict _ keys 元素

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

我怎么能这么做?

228390 次浏览

在字典中调用 list():

keys = list(test)

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

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

这不是一个完整的答案,但也许是一个有用的提示

next(iter(q))

list(q)[0]

因为整个东西不需要存储在内存中。

对于10.000.000项目,我发现它几乎快了40.000倍。

* 第一项的情况下,一个字典只是一个伪随机项目之前的 Python 3.6(之后,它的顺序在标准的实现,虽然它不建议依赖于它)。

test = {'foo': 'bar', 'hello': 'world'}
ls = []
for key in test.keys():
ls.append(key)
print(ls[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元素,请仔细查看您的代码。也许你不需要。

我想要的“键”和“值”对第一个字典项目。

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

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

也看看这个 详细的答案

如果需要切割字典键(不仅仅是第一个键) ,不要在 test上调用 list(),而是从内置的 itertools模块中使用 islice马克的回答中泛化该方法。

from itertools import islice
# slice test.keys from index l to index u
some_keys = list(islice(test, l, u))

根据切片大小相对于字典大小的不同,此方法的速度比

list(test)[l:u]

例如,在下面的例子中,它的速度大于43000倍。

n = 10_000_000
test = dict(zip(range(n), [0,1,2,3,4]*(n//5)))


%timeit list(islice(test, 10, 30))
# 4.43 µs ± 193 ns per loop (mean ± std. dev. of 7 runs, 100 loops each)


%timeit list(test)[10:30]
# 192 ms ± 2.65 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)