在Python中访问字典中的任意元素


506

如果a mydict不为空,则访问以下任意元素:

mydict[mydict.keys()[0]]

有什么更好的方法吗?


3
他说的是什么。.如果dict中只有一个元素,或者您不在乎返回哪个元素,这只是一个有效的问题。
皇家

5
是的,我只需要访问dict中的任何元素,所以这就是为什么我要访问第一个元素。
斯坦(Stan)2010年

2
@斯坦:但是正如格雷格所说,字典中没有确定的“第一”元素。所以也许您应该更改您的问题,只是为了清楚
tdihp

10
我认为这是一个有效的问题。如果您需要访问任意元素,并且确定dict不为空,则最好输入“ first”,因为可能不知道项数。
kap

7
@MichaelScheper你要投给列表:list(mydict.keys())[0]
丹尼尔·莫斯科维奇

Answers:


600

在Python 3上,非破坏性和迭代性地:

next(iter(mydict.values()))

在Python 2上,非破坏性和迭代性地:

mydict.itervalues().next()

如果希望它在Python 2和3中都可以使用,则可以使用该six包:

six.next(six.itervalues(mydict))

尽管在这一点上它还是很神秘的,但我还是更喜欢您的代码。

如果要删除任何项目,请执行以下操作:

key, value = mydict.popitem()

请注意,“ first”在此处可能不是合适的术语,因为dict在Python <3.6中不是有序类型。Python 3.6+ dicts已订购。


35
不是dict.iterkeys().next()
John Machin

12
@John Machin:好吧,问题似乎是访问与第一个键相关联的值,所以这也是我在答案中所做的。
2010年

5
这看起来更好:dict.values().__iter__().__next__():)
Vitaly Zdanevich

17
令人讨厌的是dict.keys()不能直接迭代。
semiomant

3
对于非破坏性的popitem,您可以制作(浅)副本:key, value = dict(d).popitem()
Pelle

139

如果您只需要访问一个元素(由于字典不能保证排序,则是偶然的第一个元素),您可以在Python 2中简单地做到这一点:

my_dict.keys()[0]     -> key of "first" element
my_dict.values()[0]   -> value of "first" element
my_dict.items()[0]    -> (key, value) tuple of "first" element

请注意(据我所知),Python不保证对这些方法中任何一个的2个连续调用将返回具有相同顺序的list。Python3不支持此功能。

Python 3中

list(my_dict.keys())[0]     -> key of "first" element
list(my_dict.values())[0]   -> value of "first" element
list(my_dict.items())[0]    -> (key, value) tuple of "first" element

90
这仅适用于Python 2.x,对于3.x,您必须使用list(my_dict.keys())[0]
alldayremix 2013年

6
那么,这是什么复杂度等级?当然,list(my_dict.keys())[0]不是偷懒吗?
Evgeni Sergeev

1
为了澄清起见,@alldayremix的注释在python 3.x中是什么my_dict.function()结果不支持索引,这就是为什么我们首先必须将其转换为列表然后可以使用索引[0]的原因
Noki

57

在python3中,方式:

dict.keys() 

返回类型为dict_keys()的值,当通过这种方式获得dict的键的第一个成员时,我们将得到一个错误:

dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing

最后,我将dict.keys()转换为列表@ 1st,并通过列表拼接方法获得了第一个成员:

list(dict.keys())[0]

这是最简单的解决方案,可在python2和python3中使用。
mattmilten 2015年

为了我的钱。我说这个答案是最直观
托马斯Valadez

是的,但这不能回答OP问题,即如何获得VALUES而不是键。
Mike Williamson

1
@MikeWilliamson希望大多数读者会知道如何从python字典获得给定键的相应值。
eric

5
要获得任意项而不是任意键,您可以类似地执行list(dict.values())[0]
jhin

24

拿到钥匙

next(iter(mydict))

获得价值

next(iter(mydict.values()))

两者兼得

next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2

前两个是Python 2和3。后两个在Python 3中是惰性的,但在Python 2中则不是。


16

正如其他人提到的那样,由于字典没有保证的顺序(它们被实现为哈希表),因此没有“第一项”。例如,如果您想要与最小键对应的值,则thedict[min(thedict)]可以这样做。如果您关心键的插入顺序,即“首先”是指“最早插入”,那么在Python 3.1中,您可以使用collections.OrderedDict,即将在即将发布的Python 2.7中使用;对于旧版本的Python,请下载,安装并使用有序的dict反向移植(2.4及更高版本),您可以在此处找到。

Python 3.7 现在,字典按插入顺序排序。


11

这个怎么样。这里还没有提到。

py 2&3

a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2

5
dict.values()返回一个视图,因此应为O(1)。list(a)返回一个新列表,因此将为O(n)。
博西

如果a = {“ a”:{“ 1”}}
qasimzee,

11

忽略有关字典排序的问题,这可能会更好:

next(dict.itervalues())

这样,我们避免了项目查找,并生成了我们不使用的键列表。

Python3

next(iter(dict.values()))

2
values()将复制所有值(键的keys()也会复制),因此这将导致许多操作O(n ^ 2)。
格伦·梅纳德

那么OP版本会吗?我将其更改为使用迭代器。
Matt Joiner 2010年

4
这只是Python2。对于Python 3,我们需要next(iter(dict.values()))获得相同的结果而不创建列表。
kap


2

您可以随时这样做:

for k in sorted(d.keys()):
    print d[k]

如果排序对您有任何意义,这将为您提供一致的排序键(关于内置 .hash()我猜)。例如,这意味着即使您扩展字典,数字类型也会一致地排序。

# lets create a simple dictionary
d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100}
print d.keys()
print sorted(d.keys())

# add some other stuff
d['peter'] = 'peter'
d['parker'] = 'parker'
print d.keys()
print sorted(d.keys())

# some more stuff, numeric of different type, this will "mess up" the keys set order
d[0.001] = 0.001
d[3.14] = 'pie'
d[2.71] = 'apple pie'
print d.keys()
print sorted(d.keys())

请注意,字典在打印时已排序。但是键集本质上是一个哈希图!


2

对于Python 2和3:

import six

six.next(six.itervalues(d))

这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。
Martin Tournoij 2015年

这恰恰Is there any better way to do this?以简短的方式回答了这个问题。
oblalex

这个答案已经给出了两次,其中一个已经在该站点上使用了将近5年。这是对另一个答案的评论(例如:这是改进答案以使其在Python 2和3上均可使用的方法),而不是“新”答案。在这种情况下,SO的审核系统会自动添加一个没有帮助的注释……
Martin Tournoij 2015年

不,先生。您是在17个小时前(即我编写此答案的1小时后)将此变体添加到5年答案中的。尝试在此页面上使用“查找”作为“六个”单词,您只会在这两个答案中找到6个匹配项。无论如何,这个答案真的会打扰您吗?我认为这将来可能会对其他人有所帮助,这是可以的。那怎么办?
oblalex

那是因为恕我直言,这个答案本来应该是对该帖子的编辑。如果不进行编辑,人们将不得不向下滚动许多页面才能看到您的答案。您是否认为这比编辑与您的答案几乎完全相同的高度支持的答案有用吗?
马丁·图尔诺伊


-1

没有外部库,可在Python 2.7和3.x上运行:

>>> list(set({"a":1, "b": 2}.values()))[0]
1

对于aribtrary键,只需忽略.values()

>>> list(set({"a":1, "b": 2}))[0]
'a'

-2

子类化dict是一种方法,尽管效率不高。如果您提供整数,它将返回d[list(d)[n]],否则按预期方式访问字典:

class mydict(dict):
    def __getitem__(self, value):
        if isinstance(value, int):
            return self.get(list(self)[value])
        else:
            return self.get(value)

d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a',
            'e': 'test', 'f': 'dictionary', 'g': 'testing'})

d[0]    # 'hello'
d[1]    # 'this'
d['c']  # 'is'
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.