【问题标题】:How do you find the first key in a dictionary?如何找到字典中的第一个键?
【发布时间】:2015-08-02 10:50:02
【问题描述】:

我正试图让我的程序从字典中打印出"banana"。最简单的方法是什么?

这是我的字典:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}

【问题讨论】:

  • 您要按字面意思打印单词“banana”还是与“banana”关联的值(在本例中为 4)?
  • to print out banana with a FOR loop, so when I run it, each key would also be printed out 你的意思是for k in prices: print k?这将打印出字典中的所有键。
  • 至第一条评论:在 python 3.6+ 中,字典是有序的(参见stackoverflow.com/questions/39980323/…

标签: python dictionary


【解决方案1】:

在实际订购 dicts 的 Python 版本上,您可以这样做

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

对于要订购的 dicts,您需要 Python 3.7+,如果您可以依赖 Python 3.6 上 dicts 在技术上实现细节的有序性质,则需要 Python 3.6+。

对于早期的 Python 版本,没有“第一个键”,但这会给您“一个键”,如果只有一个,则特别有用。

【讨论】:

  • 如果你想要 Python 3 中的键和值:next(iter( my_dict.items() ))
  • @RyanHaining Python dicts 是按从 CPython 3.6 开始的插入顺序和从 Python 3.7 开始的任何其他 Python 实现排序的
【解决方案2】:

字典没有索引,但它在某种程度上是有序的。以下将为您提供第一个现有密钥:

list(my_dict.keys())[0]

【讨论】:

  • list(my_dict)[0] 放入会不会更容易,因为它无论如何都会检索键列表?
  • @Jean-FrancoisT。是的
  • 字典现在在 CPython 3.6 和从 Python 3.7 开始的所有其他 Python 实现中排序
  • 您创建附加列表只是为了获得一个元素。多么浪费内存和 CPU。
【解决方案3】:

更新: 从 Python 3.7 开始,插入顺序保持不变,因此您不需要在此处使用 OrderedDict。您可以将以下方法与普通的 dict 一起使用

在 3.7 版中更改: 字典顺序保证为插入顺序。这种行为是 CPython 3.6 的实现细节。

source


Python 3.6 及更早版本*

如果你说的是普通的dict,那么“第一把钥匙”没有任何意义。键没有以任何您可以依赖的方式排序。如果您遍历 dict,您可能不会首先看到 "banana"

如果您需要保持井井有条,那么您必须使用OrderedDict 而不仅仅是普通字典。

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

如果您想按顺序查看所有键,您可以通过迭代来实现

for k in prices:
    print(k)

您也可以将所有键放入一个列表中,然后使用该列表

ks = list(prices)
print(ks[0]) # will print "banana"

在不创建列表的情况下获取 first 元素的更快方法是在迭代器上调用 next。但是,当尝试获取 nth 元素时,这并不能很好地概括

>>> next(iter(prices))
'banana'

* CPython 在 3.6 中已保证插入顺序作为实现细节。

【讨论】:

  • 感谢您的建议。我很抱歉没有更清楚。我只是想找到让我打印出“香蕉”而不是与之关联的值的代码。感谢您的所有意见!
【解决方案4】:

如果您只想要字典中的第一个键,您应该使用许多人之前建议的方法

first = next(iter(prices))

但是,如果您想要第一个并将其余的保留为列表,您可以使用值解包运算符

first, *rest = prices

同样适用于将prices 替换为prices.values() 的值,对于键和值,您甚至可以使用解包赋值

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

注意:您可能很想使用 first, *_ = prices 来获取第一个键,但我一般建议不要使用这种用法,除非字典很短,因为它遍历所有键并为rest 创建一个列表有一些开销。

注意:正如其他人所提到的,插入顺序是从python 3.7(或技术上是 3.6)及更高版本保留的,而早期的实现应被视为未定义的顺序。

【讨论】:

  • 优秀。谢谢
【解决方案5】:

dict 类型是一个 无序 映射,因此不存在“第一个”元素之类的东西。

你想要的可能是collections.OrderedDict

【讨论】:

  • 或者一个namedtuple,如果它是不可变的
  • 自 Python 3.6 起这已更改。字典现已排序。
  • 从技术上讲,如果您确定,您需要字典键的第一个元素,只有一个键。
  • 一个人可以在迭代一个如果被修复的字典时说出第一项。但祝你好运。
【解决方案6】:

所以我在尝试优化获取已知长度为 1 的字典中的唯一键并仅返回该键时发现了这个页面。在我尝试过的所有字典中,以下过程是最快的,最大为 700。

我尝试了 7 种不同的方法,发现这是最好的,在我的 2014 年 Macbook 上使用 Python 3.6:

def first_5():
    for key in biased_dict:
        return key

分析它们的结果是:

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7

我尝试的所有方法都在这里:

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key

【讨论】:

  • 那么做一个for循环并返回第一个键(first_5)实际上是我所看到的最快的?也是对不同方法的一个很好的比较。
  • 是的,不仅是最快的,而且是一英里之外最快的。也是最容易阅读、方便的。
  • 您说的是最快和最慢方法之间的差异不到半微秒。除非您的代码花费 10% 以上的时间来获取字典的第一个元素,否则尝试优化这是一件很奇怪的事情。
【解决方案7】:

那么简单,我的答案是

first = list(prices)[0]

将字典转换为列表将输出键,我们将从列表中选择第一个键。

【讨论】:

  • 对于 python3,没有必要创建一个全新的列表来只检索它的第一个元素。正如其他答案已经建议的那样,更好地使用next(iter(prices))
  • @normanius 虽然该解决方案会在空字典上引发错误...这实际上取决于用例,但我认为在某些情况下创建列表可能很有用(如果您知道字典会很小,例如它可能是空的)
【解决方案8】:

正如许多其他人指出的那样,字典中没有第一个值。它们中的排序是任意的,您不能指望每次访问字典时排序都是相同的。但是,如果您想打印密钥,有几种方法:

for key, value in prices.items():
    print(key)

此方法使用元组赋值来访问键和值。如果您出于某种原因需要同时访问键和值,这很方便。

for key in prices.keys():
    print(key)

这只会像keys() 方法所暗示的那样提供对密钥的访问权限。

【讨论】:

    【解决方案9】:

    使用 for 循环遍历 prices 中的所有键:

    for key, value in prices.items():
         print key
         print "price: %s" %value
    

    如果您使用的是 Python 2.x,请确保将 prices.items() 更改为 prices.iteritems()

    【讨论】:

      【解决方案10】:

      d.keys()[0] 获取单个密钥。

      更新:- @AlejoBernardin,我不知道你为什么说它不起作用。在这里,我检查并成功了。 导入集合

      prices  = collections.OrderedDict((
      
          ("banana", 4),
          ("apple", 2),
          ("orange", 1.5),
          ("pear", 3),
      ))
      prices.keys()[0]
      

      '香蕉'

      【讨论】:

      • 按票数来看,为什么这不是最好的解决方案?
      • 这适用于 python2 但不适用于 python3。在python3中,dict.keys()返回一个'dict_keys' object而不是一个不支持索引的list
      • TypeError: 'dict_keys' 对象不支持索引
      【解决方案11】:

      使用下面的一个非常合乎逻辑和快速的班轮。在 for 循环中,只需立即调用 break 即可退出并获取值。

      for first_key in prices:  break
      print(first_key)
      

      如果你还想要键和值。

      for first_key, first_value in prices.items():  break
      print(first_key, first_value)
      

      【讨论】:

        【解决方案12】:

        这适用于 Python 2 但不适用于 Python 3 (TypeError: 'dict_keys' object is not subscriptable):

        first_key = my_dict.keys()[0]  
        

        对于一个小列表,例如你会得到一个 dict 的响应,它是一个元素,你可以先将其转换为列表:

        assert len(my_dict)==1
        key = list(my_dict.keys())[0]
        

        如果它是一个相当长的字典,最好使用@Ryan sujested 的方法,因为它应该更有效。

        【讨论】:

        • 它引发了TypeError: 'dict_keys' object is not subscriptable,至少在 Python 3.8 中
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-28
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        • 2021-10-16
        相关资源
        最近更新 更多