为什么我可以轻松地在Python中进行for循环,以按照我添加元素的顺序循环遍历字典的所有元素,但是没有明显的方法来访问特定元素?当我说元素我正在谈论一个键+值对时。
我已经查看了Python上一些关于词典的基本教程,但没有一个回答我的问题,我也无法在docs.python.org找到答案。
根据: accessing specific elements from python dictionary(Senderies评论)dict应该是无序的但是为什么for循环按照我把它们放入的顺序打印它们?
答案 0 :(得分:7)
您可以通过键访问字典中的特定元素。这就是字典的含义。如果该行为不是您想要的,请使用字典以外的其他内容
一个dict应该是无序的但是为什么for循环按照我把它们放入的顺序打印它们?
巧合:基本上,你碰巧按照Python喜欢的顺序放入它们。这不是很难做到,特别是对于整数(int
s是他们自己的哈希值,并且倾向于以升序数字顺序从dict中出来,尽管这是实现细节在其他Python实现中可能不是真的CPython,特别是如果你按照数字顺序将它们放在一起开始。
“无序”实际上意味着您无法控制订单,并且可能会因各种特定于实施的标准而发生变化,因此您不应该依赖它。当然,当您迭代字典时,元素会以某些顺序出现。
如果您需要能够通过数字索引访问字典元素,有很多方法可以做到这一点。 collections.OrderedDict
是标准方式;密钥始终按您添加的顺序返回,因此您始终可以foo[foo.keys()[i]]
访问i
元素。您还可以使用其他方案。
答案 1 :(得分:5)
通过散列密钥来访问Python dicts。因此,如果你有任何类似的大小,并且你按照它们的顺序出现了事情,那么是时候开始投注彩票了!
my_dict = {}
my_dict['a'] = 1
my_dict['b'] = 2
my_dict['c'] = 3
my_dict['d'] = 4
for k,v in my_dict.items():
print k, v
的产率:
a 1
c 3
b 2
d 4
答案 2 :(得分:0)
d = {}
d['first'] = 1
d['second'] = 2
d['third'] = 3
print d
# prints {'seconds': 2, 'third': 3, 'first': 1}
# Hmm, just like the docs say, order of insertion isn't preserved.
print d['third']
# prints 3
# And there you have it: access to a specific element
答案 3 :(得分:0)
如果要按插入顺序遍历项目,则应使用OrderedDict。普通的字典不保证也会这样做,所以如果你依赖它就会在以后遇到麻烦。
如果要访问特定项目,则应使用[]
运算符或get()
方法通过其键访问该项。毕竟,这是dict的主要功能。
答案 4 :(得分:0)
多个值的散列结果因值而异:
有时订单似乎保留:跟随 d_one
的示例通常,订单不会保留:以下示例 d_two
相信无论如何保持秩序只是因为你被明显保守的特定案件所欺骗
d_one = {}
for i,x in enumerate((122,'xo','roto',885)):
print x
d_one[x] = i
print
for k in d_one:
print k
print '\n=======================\n'
d_two = {}
for i,x in enumerate((122,'xo','roto','taratata',885)):
print x
d_two[x] = i
print
for k in d_two:
print k
结果
122
xo
roto
885
122
xo
roto
885
=======================
122
xo
roto
taratata
885
122
taratata
xo
roto
885
顺便说一下,你所谓的“字典元素”通常被称为“字典的项目”(因此字典的方法items()和iteritems())