【问题标题】:Access an arbitrary element in a dictionary in Python在 Python 中访问字典中的任意元素
【发布时间】:2011-03-07 02:05:24
【问题描述】:

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

mydict[mydict.keys()[0]]

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

【问题讨论】:

  • 他说了什么.. 如果字典中只有一个元素,或者您不在乎返回哪个元素,这才是一个真正有效的问题。
  • 是的,我只需要访问字典中的任何元素,这就是我想访问第一个元素的原因。
  • @Stan:但正如 Greg 所说,dict 中没有明确的“第一个”元素。所以也许你应该改变你的问题,只是为了清楚
  • 我认为这是一个有效的问题。如果您需要访问任意元素,并且您确定 dict 不为空,那么询问“第一个”可能是个好主意,因为可能不知道项目的数量。
  • @MichaelScheper 你必须投到名单:list(mydict.keys())[0]

标签: python dictionary


【解决方案1】:

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

next(iter(mydict.values()))

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

mydict.itervalues().next()

如果您希望它同时在 Python 2 和 3 中工作,您可以使用 six 包:

six.next(six.itervalues(mydict))

虽然在这一点上它非常神秘,我更喜欢你的代码。

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

key, value = mydict.popitem()

请注意,“第一”在这里可能不是一个合适的术语,因为dict 在 Python dicts 已订购。

【讨论】:

  • 你不是说dict.iterkeys().next()吗?
  • @John Machin:嗯,这个问题似乎是访问与第一个键关联的值,所以这也是我在答案中所做的。
  • 这看起来更好:dict.values().__iter__().__next__() :)
  • 令人讨厌的是 dict.keys() 不能直接迭代。
  • 对于非破坏性的popitem,您可以制作(浅)副本:key, value = dict(d).popitem()
【解决方案2】:

如果您只需要访问一个元素(偶然是第一个,因为 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

请注意(据我所知)Python 不保证对任何这些方法的 2 次连续调用将返回具有相同顺序的列表。 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

【讨论】:

  • 这仅适用于 Python 2.x,对于 3.x,您必须使用 list(my_dict.keys())[0]
  • 那么,这是什么复杂度等级?当然,list(my_dict.keys())[0] 不懒?
  • 澄清一下,@alldayremix 对该评论的含义是在 python 3.x my_dict.function() 结果不支持索引,这就是为什么首先我们必须将其转换为列表然后我们可以使用索引 [0]
  • @EvgeniSergeev 我想它在时间和空间上都具有线性复杂性 - 效率非常低。我无法想象这怎么可能是懒惰的——有一个列表构造函数调用......这可能也适用于 Python 2 解决方案,来自文档Return a copy of the dictionary’s list of values.——他们在 Python 3 中更改它的原因,以及为什么订阅是不再有效
  • 想指出调用 list(my_dict.keys())[0] 基本上违背了 python 3 values() 的行为意图 - 考虑:for val in d.values(): break - 在 python 3 中这是 O(1) 而在 python 2 中这是复制整个值列表 - O(n) - 只是为了丢弃它......这个答案复制整个列表以仅获取其中一个值
【解决方案3】:

在python3中,方式:

dict.keys() 

return a value in type : dict_keys(),这样获取dict的第一个key成员时会报错:

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

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

list(dict.keys())[0]

【讨论】:

  • 这是最简单的解决方案,适用于 python2 和 python3。
  • 为了我的钱。我说这个答案是最直观的
  • 是的,但这并不能回答 OP 的问题,即如何获取 VALUES,而不是键。
  • @MikeWilliamson 希望大多数读者都知道如何从 python 字典中获取给定键的相应值。
  • 要获取任意项,而不是任意键,您可以类似地执行list(dict.values())[0]
【解决方案4】:

获取密钥

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 中不是。

【讨论】:

    【解决方案5】:

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

    Python 3.7 Now dicts 是按插入顺序排列的。

    【讨论】:

      【解决方案6】:

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

      next(dict.itervalues())
      

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

      Python3

      next(iter(dict.values()))
      

      【讨论】:

      • values() 将复制所有值(keys() 对键也是如此),因此这将使许多操作 O(n^2)。
      • OPs 版本也会这样吗?然后我将其更改为使用迭代器。
      • 这只是 Python 2。对于 Python 3,我们需要next(iter(dict.values())) 才能在不创建列表的情况下获得相同的结果。
      【解决方案7】:

      怎么样,这个。此处暂未提及。

      py 2 & 3

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

      【讨论】:

      • dict.values() 返回一个视图,所以应该是 O(1)。 list(a) 返回一个新列表,所以是 O(n)。
      • 另外,如果 a = {"a": {"1"}},它似乎在 python2 中不起作用
      【解决方案8】:

      在python3中

      list(dict.values())[0]
      

      【讨论】:

      • 如果字典有十亿个条目会怎样? :)
      【解决方案9】:

      你总是可以这样做的:

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

      这将为您提供一致排序的(关于 builtin.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())
      

      请注意,字典在打印时已排序。但是key set本质上是一个hashmap!

      【讨论】:

        【解决方案10】:

        对于 Python 2 和 3:

        import six
        
        six.next(six.itervalues(d))
        

        【讨论】:

        • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
        • 这正好回答了Is there any better way to do this?这个问题。
        • 这个答案已经给出了两次,其中一个已经在这个网站上存在了将近 5 年。这是对另一个答案的评论(如:这里是如何改进答案以使其适用于 Python 2 和 3),而不是“新”答案。在这种情况下,SO 的审核系统自动放置了一个有点无益的注释......
        • 不,先生。您将此变体添加到您的 5 y.o.就在 17 小时前回答,也就是我写完这个答案 1 小时后。尝试在此页面上使用“查找”作为“六”字,您只会在这 2 个答案中找到 6 个匹配项。无论如何,这个答案真的让你感到不安吗?我认为这可能会在将来对其他人有所帮助,这没关系。那么,交易是什么?
        • 那是因为恕我直言,这个答案首先应该是对该帖子的编辑。如果没有编辑,人们将不得不向下滚动几页才能看到您的答案;您认为这比编辑与您的几乎完全相同的高度赞成的答案更有用吗?
        【解决方案11】:
        first_key, *rest_keys = mydict
        

        【讨论】:

        • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
        【解决方案12】:

        没有外部库,适用于 Python 2.7 和 3.x:

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

        对于任意键,只需省略 .values()

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

        【讨论】:

          【解决方案13】:

          子类化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'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-05-22
            • 1970-01-01
            • 1970-01-01
            • 2019-02-03
            相关资源
            最近更新 更多