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

Sta*_*tan 474 python dictionary

如果a mydict不为空,我访问任意元素:

mydict[mydict.keys()[0]]
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?

dou*_*lep 558

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

next(iter(mydict.values()))
Run Code Online (Sandbox Code Playgroud)

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

mydict.itervalues().next()
Run Code Online (Sandbox Code Playgroud)

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

six.next(six.itervalues(mydict))
Run Code Online (Sandbox Code Playgroud)

虽然在这一点上它是相当神秘的,我宁愿你的代码.

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

key, value = mydict.popitem()
Run Code Online (Sandbox Code Playgroud)

请注意,"first"在这里不是一个合适的术语.这是"任何"项目,因为dict它不是有序类型.

  • 你不是指`dict.iterkeys().next()`? (35认同)
  • 令人讨厌的是dict.keys()不能直接迭代. (14认同)
  • @John Machin:好吧,这个问题似乎可以获得与第一把钥匙相关的价值,所以这也是我在答案中所做的. (11认同)
  • 这看起来更好:`dict.values().__ iter __().__ next __()`:) (3认同)
  • 对于非破坏性的popitem,你可以制作一个(浅)副本:`key,value = dict(d).popitem()` (3认同)
  • 从Python 3.7开始,默认情况下dict是按插入顺序排序的。 (3认同)

swK*_*swK 128

如果您只需要访问一个元素(第一个是偶然的,因为dicts不保证排序),您可以在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
Run Code Online (Sandbox Code Playgroud)

请注意(据我所知)Python不保证对这些方法中的任何一个的连续两次调用将返回具有相同排序的列表.Python3不支持此功能.

  • 这只适用于Python 2.x,对于3.x你必须使用`list(my_dict.keys())[0] (87认同)
  • 那么,这是什么复杂性类?当然,`list(my_dict.keys())[0]`不是懒惰的? (6认同)

Xb7*_*kjb 56

在python3中,方式:

dict.keys() 
Run Code Online (Sandbox Code Playgroud)

返回类型中的值:dict_keys(),这样得到dict键的第一个成员时会出错:

dict.keys()[0]
TypeError: 'dict_keys' object does not support indexing
Run Code Online (Sandbox Code Playgroud)

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

list(dict.keys())[0]
Run Code Online (Sandbox Code Playgroud)

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

max*_*lec 24

得到一把钥匙

next(iter(mydict))
Run Code Online (Sandbox Code Playgroud)

获得一个价值

next(iter(mydict.values()))
Run Code Online (Sandbox Code Playgroud)

得到两者

next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2
Run Code Online (Sandbox Code Playgroud)

前两个是Python 2和3.最后两个在Python 3中是懒惰的,但在Python 2中则不然.


Ale*_*lli 16

正如其他人所提到的,没有"第一项",因为字典没有保证顺序(它们被实现为哈希表).例如,如果您想要与最小键对应的值,则thedict[min(thedict)]可以执行此操作.如果你关心键的插入顺序,即"first"你的意思是"插入最早",那么在Python 3.1中你可以使用collections.OrderedDict,它也在即将发布的Python 2.7中; 对于旧版本的Python,请下载,安装和使用您可以在此处找到的有序dict backport(2.4及更高版本).

Python 3.7 现在 dicts是有序的插入.


Mat*_*ner 11

忽略围绕dict排序的问题,这可能会更好:

next(dict.itervalues())
Run Code Online (Sandbox Code Playgroud)

这样我们就可以避免项目查找并生成我们不使用的密钥列表.

Python3

next(iter(dict.values()))
Run Code Online (Sandbox Code Playgroud)

  • 这只是Python 2.对于Python 3,我们需要`next(iter(dict.values()))`来获得相同的结果而不创建列表. (4认同)
  • values()将复制所有值(与keys的keys()一样),因此这将使许多操作O(n ^ 2). (2认同)

ani*_*ija 11

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

py 2&3

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

  • `dict.values()`返回一个视图,所以应该是O(1).`list(a)`返回一个新列表,因此是O(n). (5认同)

Ole*_*tei 6

在python3中

list(dict.values())[0]
Run Code Online (Sandbox Code Playgroud)

  • 如果字典有十亿个条目会怎么样?:) (4认同)