【问题标题】:non-destructive version of pop() for a dictionary字典的非破坏性版本 pop()
【发布时间】:2011-04-29 12:11:05
【问题描述】:

是否有任何习惯用法可以从字典中获取任意键、值对而不删除它们? (P3K)

编辑:

抱歉,措辞令人困惑。

我使用任意这个词的意思是我不在乎我得到什么。

这与随机不同,我确实关心我得到什么(即,我需要每个项目被选择的概率相同)。

而且我没有钥匙可以使用;如果我这样做了,我会认为它属于 RTFM 类别,因此不值得回答。

编辑:

不幸的是,在 P3K 中,.items() 返回一个 dict_items 对象,不像 Python 2 返回一个迭代器:

ActivePython 3.1.2.4 (ActiveState Software Inc.) based on
Python 3.1.2 (r312:79147, Sep 14 2010, 22:00:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> d = {1:2}
>>> k,v = next(d.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: dict_items object is not an iterator

【问题讨论】:

  • 你的意思是.popitem()的无损版本吗?
  • “任意”是什么意思?你会做不止一次吗?如果是,每次都应该不同吗?
  • 我可能不止一次这样做;但我完全可以得到相同的值或不同的值。
  • 在 Py2 中 dict.items() 返回一个二元组(键,值)的列表。 dict.iteritems() 返回这样的迭代器。在 Py3 中 dict.items() 返回一个 dict 视图对象,而 dict.iteritems() 不见了。
  • 那么next(iter(d.items())) 会是最好的吗?

标签: python dictionary python-3.x


【解决方案1】:
k, v = next(iter(d.items())) # updated for Python 3

【讨论】:

  • 2.x 用户(例如,除了 OP 之外的几乎所有人),请务必使用 iteritems
  • @Glenn - 完全正确。一开始我是用iteritems()写的,后来看到这个P3K,不得不思考P3K有什么新东西。
  • 谢谢...我开始学习Python,并认为我应该选择最新版本.. :)
  • 哦,伙计,它不起作用:(请参阅我对问题的编辑。所以我想我必须使用k, v = next(iter(d.items()))
【解决方案2】:

pop 应该删除一个项目。这不就是那个方法的意思吗?

如果要获取随机键、值对使用伪随机模块

>>> import random
>>> x = {1:3, 4:5, 6:7}
>>> x = {1:3, 4:5, 6:7, 'a':9, 'z':'x'}
>>> k = random.choice(x.keys())
>>> x[k]
7
>>> 

【讨论】:

  • 查看@Glenn Maynard 对 AndrewBC 的回答的评论。
【解决方案3】:

items() 方法将字典的键值对的副本作为列表返回。例如, >fruits_color = {'apple': 'red', 'banana': 'green'}
>fruits_color.items()
[('apple', 'red'), ('banana', 'green')]

获得列表后,您可以选择键值对。

【讨论】:

    【解决方案4】:
    import random
    k, v = random.choice(d.items())
    

    【讨论】:

    • “任意”不代表“随机”;这里没有任何随机化的理由。
    • @Glenn Maynard。你怎么知道?获取“任意”项目是 get()[] 所做的。如果get() 的这种微不足道的、明显的使用不是正确的答案,那么一定有一些神秘的其他力量在起作用。喜欢随机性。
    • get[] 检索特定项,而不是任意项,并且它们无关紧要,因为您必须事先知道密钥才能使用它们。 (他真的是在问我怎么知道“任意”这个词是什么意思吗?)
    • @Glenn Maynard。 OP 可能并不意味着随机选择,但这只是获得任意东西和任意获得某物之间的区别。这可能是一个有效的推论,但在这种情况下可能不是。
    • 在py3k上你需要list(d.items())
    【解决方案5】:

    获取“任意”键值对?

    k, v = k, d[k]
    

    【讨论】:

    • 我的问题是我没有k 可供我使用。所以我需要从字典中给我kv 的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多