如何索引字典?


96

我在下面有一个字典:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}

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

colors[0]KeyError由于明显的原因将返回。


4
“第一”是什么意思?字典没有排序。
S.Lott

2
字典现在插入因为Python 3.7下令检查了这一点:stackoverflow.com/questions/39980323/...
尼基塔Alkhovik


1
@ S.Lott我敢打赌他不会问他是否知道他们是无秩序的:)。
user7778287 '19

Answers:


111

在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")]

如果您不需要通过密钥访问。(为什么您的数字是字符串?)

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


2
在Python 2中,使用d.iterkeys().next()而不是d.keys()[0]检查其中一个键而不删除它。如果字典很大,则在性能上会有很大的不同。值和项目也一样。在Python 2.7中,您还可以使用dict视图对象
simleo 2014年

44
在Python 3中,这些调用返回一个视图,而不是实际列表,因此您应将它们包装在对list()的调用中,否则将看到:“ TypeError:'dict_values'对象不支持索引”。看到这个太问题:stackoverflow.com/questions/17431638/...
stifin

3
修正的只是一个NIT:你不是可以索引项(),至少不会出现在Python 3
约翰·斯特朗

1
这个答案对于python 3.6+已经过时了,请参阅下面@Pasha的答案。
汉斯

1
@hans对于Python 3.7,此答案已过时,但对于Python 3.6,答案却已过时,因为字典的保留顺序性质是该Python版本的CPython实现的实现细节,而不是该语言的官方组成部分。我将相应地更新此答案。
斯文·马纳赫

111

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

由于Python 3.7 *字典是顺序保留的,也就是说它们现在的行为与collections.OrderedDicts完全相同。不幸的是,仍然没有专用的方法可以索引到字典的keys()/values()中,因此可以通过以下方法获取字典中的第一个键/值:

first_key = list(colors)[0]
first_val = list(colors.values())[0]

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

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

first_key = get_first_key(colors)
first_val = colors[first_key]

如果您需要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") 

(* CPython 3.6已经包含有序字典,但这只是实现细节。语言规范包括3.7以后的有序字典。)


请提供相应文档的链接吗?
阿米尔·阿非尼安

3

处理字典中的元素就像坐在驴上,享受旅程。

作为Python的规则,字典是无序的

如果有

dic = {1: "a", 2: "aa", 3: "aaa"}

现在假设如果我喜欢dic[10] = "b",那么它不会总是这样添加

dic = {1:"a",2:"aa",3:"aaa",10:"b"}

可能像

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}

要么

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}

要么

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}

或任何此类组合。

所以经验法则是字典无序的


这是很棘手的...我喜欢!
刘Liu


2

实际上,我找到了一个新颖的解决方案,确实帮了我大忙,如果您特别关心列表或数据集中某个值的索引,则可以将dictionary的值设置为该Index !:

只是看:

list = ['a', 'b', 'c']
dictionary = {}
counter = 0
for i in list:
   dictionary[i] = counter
   counter += 1

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2}

现在,借助哈希图的强大功能,您可以在恒定时间内(也就是快得多)拉入条目的索引


1

哦,那是一个艰难的过程。基本上,这里的每个项目都有两个值。然后,您尝试使用数字作为键来呼叫他们。不幸的是,您的值之一已经设置为键!

试试这个:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

现在,您可以按数字调用键,就像它们像列表一样被索引。您还可以通过颜色和数字在列表中的位置进行引用。

例如,

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

当然,您将不得不想出另一种方式来跟踪每种颜色的位置。也许您可以拥有另一本字典来存储每种颜色的键值。

colors_key = {'蓝色':1,'红色':6,'yllow':8}

然后,您也可以根据需要查找颜色键。

colors [colors_key ['blue']] [0]将返回'blue'

这样的事情。

然后,当您使用它时,可以使用数字值作为键进行字典操作,以便始终可以使用它们来查找颜色(如果需要)。

值= {5:[1,'蓝色'],6:[2,'红色'],8:[3,'黄色']}

然后,(colors [colors_key [values [5] [1]]] [0])将返回'blue'。

或者,您可以使用列表列表。

祝好运!


0

您不能,因为它dict是无序的。您可以.popitem()用来获取任意项,但这会将其从dict中删除。


next(iter(d.items())).iteritems()在Python 2中)也为您提供了一个任意项(在我的测试中也是一样,这很有意义,因为popitem可以使用此实现),但不会删除该项。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.