您如何在字典中找到第一个键?


199

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

这是我的字典:

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

35
Python中的字典是无序的,因此没有“第一把钥匙”。看到这里
David Robinson

2
您要直接打印单词“ banana”还是与“ banana”相关联的值(在本例中为4)?
Paul H

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吗 这将打印出词典中的所有键。
David Robinson


7
在第一个注释:在Python 3.6+ dictionariesare订购(见stackoverflow.com/questions/39980323/...
Egirus Ornila

Answers:


283

在实际命令有序的Python版本中,您可以执行

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

对于要订购的字典,您需要Python 3.7+,如果可以,可以使用Python 3.6或更高版本,如果您愿意依靠Python 3.6上的技术在技术上有详细说明,那么该命令就可以了。

对于早期的Python版本,没有“第一把钥匙”。


29
如果您同时需要Python 3中的键和值:next(iter( my_dict.items() ))
Jonathan H

@RyanHaining Python的类型的字典被插入开始CPython的3.6和任何其他Python实现有序与Python 3.7开始
鲍里斯

1
这个答案搞砸了我的调试会话,我等待了6个小时才能到达断点。这很令人讨厌。
迈克尔

127

字典没有索引,但是以某种方式是有序的。下面将为您提供第一个现有密钥:

list(my_dict.keys())[0]

24
list(my_dict)[0]它会更容易,因为它无论如何都会检索键列表?
Jean-Francois T.

@ Jean-FrancoisT。是的
Ryan Haining

现在字典中的顺序排序CPython的3.6和所有其他Python实现开始使用Python 3.7
鲍里斯

51

更新:从Python 3.7开始,插入顺序得以保持,因此您无需在OrderedDict此处插入。您可以将以下方法与常规方法结合使用dict

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

资源


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"

在不创建列表的情况下获取第一个元素的更快方法是调用next迭代器。nth虽然尝试获取元素时这不能很好地概括

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

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


谢谢你的建议。对不起,我不清楚。我只是想找到可以让我打印出“香蕉”的代码,而不是与之关联的值。感谢所有的投入!
slagoy,2015年

31

对于下面的Python 3,消除了列表转换的开销:

first = next(iter(prices.values()))

10

dict类型是无序映射,因此没有“第一”元素之类的东西。

您想要的可能是collections.OrderedDict


或一个命名元组,如果它是不可变的
Joran Beasley

从Python 3.6开始,这种情况发生了变化。现在已订购字典。
misantroop

1
从技术上讲,如果可以肯定的话,您希望字典键的第一个元素只有一个键。
DBX12

在迭代一个固定的字典时,可以说出第一项。但是祝你好运。
demongolem

6

因此,我在尝试优化某个东西以获取已知长度为1的字典中的唯一键并仅返回键时找到了此页面。对于我尝试过的最大尺寸为700的所有字典,以下过程是最快的。

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

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

1
因此,如我所见,执行for循环并返回第一个键(first_5)实际上是最快的吗?也很好地比较了不同的方法。
PiMathCL语言

1
是的,不仅是最快的,而且是一个国家英里之外最快的。也最容易阅读,方便。
turiyag

4

好吧,根据我的答案将是

first = list(prices)[0]

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


对于python3,无需创建一个全新的列表即可仅检索其第一个元素。更好地使用next(iter(prices)),如其他答案所建议。
诺曼纽斯

1

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

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

此方法使用元组分配来访问键和值。如果由于某种原因需要同时访问键和值,这将非常方便。

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

keys()方法所暗示的那样,这将仅提供对键的访问。


1

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

更新:-@AlejoBernardin,不知道为什么您说它不起作用。在这里,我检查了一下,它起作用了。进口馆藏

prices  = collections.OrderedDict((

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

'香蕉'


按票数来看,为什么这不是最佳的解决方案?
GuSuku

18
这在python2中有效,但在python3中无效。在python3中,dict.keys()返回a 'dict_keys' object而不是list不支持索引的。
mavix

TypeError:“ dict_keys”对象不支持索引
-Anilbey

0

使用for循环,其范围为prices

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

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


0

如果您只想从字典中获得第一个键,则应使用许多以前建议的键

first = next(iter(prices))

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

first, *rest = prices

这同样适用于价值被替换pricesprices.values()和两个键和值,你甚至可以使用拆包作业

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

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

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


-3

最简单的方法是:

first_key = my_dict.keys()[0]

但是有些时候您应该更加小心,并确保您的实体是有价值的清单,因此:

first_key = list(my_dict.keys())[0]

3
TypeError: 'dict_keys' object is not subscriptable至少在Python 3.8中引起了人们的关注
Eerik Sven Puudist
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.