如何索引到字典?

Har*_*pal 72 python indexing dictionary

我在下面有一个词典:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}
Run Code Online (Sandbox Code Playgroud)

如何索引字典中的第一个条目?

colors[0]将返回一个KeyError明显的原因.

Sve*_*ach 89

字典在Python版本中是无序的,包括Python 3.6.如果您不关心条目的顺序并且想要通过索引访问键或值,则可以使用d.keys()[i]d.values()[i]d.items()[i].(请注意,这些方法会创建Python 2.x中所有键,值或项的列表.因此,如果您需要它们多一次,请将列表存储在变量中以提高性能.)

如果你关心条目的顺序,从Python 2.7开始你可以使用collections.OrderedDict.或者使用对列表

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]
Run Code Online (Sandbox Code Playgroud)

如果您不需要按键访问.(顺便提一下,为什么你的数字串?)

在Python 3.7中,正常的字典是有序的,因此您不再需要使用OrderedDict(但您仍然可以 - 它基本上是相同的类型).Python 3.6的CPython实现已包含该更改,但由于它不是语言规范的一部分,因此您不能在Python 3.6中依赖它.

  • 在Python 3中,这些调用返回一个视图,而不是一个实际的列表,所以你应该在调用list()时将它们包装起来,否则你会看到:"TypeError:'dict_values'对象不支持索引".看到这个问题:http://stackoverflow.com/questions/17431638/get-typeerror-dict-values-object-does-not-support-indexing-when-using-python (25认同)
  • 只是一点点修正:你不能索引 items(),至少在 Python 3 中不能。 (4认同)
  • 这个答案对于 python 3.6+ 来说已经过时了,请参阅下面@Pasha 的答案。 (3认同)
  • 在Python 2中,使用`d.iterkeys().next()`代替`d.keys()[0]`来检查其中一个键而不删除它.如果字典很大,那么它在性能方面会有很大的不同.值和项目也是如此.在Python 2.7中,您还可以使用[dict view objects](http://docs.python.org/2/library/stdtypes.html#dictionary-view-objects) (2认同)
  • @hans 这个答案对于 Python 3.7 来说已经过时了,但对于 Python 3.6 来说已经过时了,因为字典的顺序保留性质是该 Python 版本的 CPython 实现的一个实现细节,而不是该语言的官方部分。我会相应地更新这个答案。 (2认同)

Pas*_*sha 68

如果还有人在看这个问题,那么目前接受的答案现在已经过时了:

从Python 3.6开始,字典是保持顺序的,现在它们的行为与以前完全一样collections.OrderedDict.不幸的是,还没有专门的方法来索引keys()/ values()字典的,因此让在字典中的第一个键/值可以做到

first_key = list(colors)[0]
first_val = list(colors.values())[0]
Run Code Online (Sandbox Code Playgroud)

或者(这可以避免将键视图实例化为列表):

def get_first_key(dictionary):
    for key in dictionary:
        return key
    raise IndexError

first_key = get_first_key(colors)
first_val = colors[first_key]
Run Code Online (Sandbox Code Playgroud)

如果你需要一个n-th键,那么类似

def get_nth_key(dictionary, n=0):
    if n < 0:
        n += len(dictionary)
    for i, key in enumerate(dictionary.keys()):
        if i == n:
            return key
    raise IndexError("dictionary index out of range") 
Run Code Online (Sandbox Code Playgroud)