如何找到字典中的第一个键?(python)
- 2025-03-18 08:54:00
- admin 原创
- 51
问题描述:
我正在尝试让我的程序打印出"banana"
字典。最简单的方法是什么?
这是我的字典:
prices = {
"banana" : 4,
"apple" : 2,
"orange" : 1.5,
"pear" : 3
}
解决方案 1:
在 Python 版本中,字典实际上是有序的,你可以这样做
my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'
为了对字典进行排序,您需要 Python 3.7+,或者如果您愿意依赖 CPython 3.6 上字典的技术实现细节有序性,则需要 3.6+。
对于早期的 Python 版本,没有“第一个键”,但这将为您提供“一个键”,如果只有一个键则特别有用。
解决方案 2:
字典没有索引,但在某种程度上是有序的。下面将给出第一个现有键:
list(my_dict.keys())[0]
解决方案 3:
更新:从 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)
您也可以将所有键放入列表中,然后使用该列表
keys = list(prices)
print(keys[0]) # will print "banana"
无需创建列表即可获取第一个元素的更快方法是调用迭代器。不过,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:
更新:我决定再次测试它,现在是 2023 年 1 月,在我的 Windows 11 PC 上,使用 Ryzen 9 5900x。为了让我更容易重新运行它(亲爱的读者,您也可以轻松运行它),我在这里列出了它的要点:https://gist.github.com/maludwig/d38054ec05d01ad91df5dade8aa47d9d
结果已经出来了,first_5 依然是获胜者!
12100238 / s with first_1
9094216 / s with first_2
9219988 / s with first_3
7370554 / s with first_4
13525210 / s with first_5
9810076 / s with first_6
8676864 / s with first_7
一切都快了很多(CPU 也更好了,因为距离第一次测试已经过去了几年)。但显然也做了一些优化(详情见评论),尤其是在 first_1 中。
first_1 is 5.43x faster
first_2 is 4.77x faster
first_3 is 4.62x faster
first_4 is 4.15x faster
first_5 is 3.67x faster
first_6 is 3.47x faster
first_7 is 3.34x faster
Current scoreboard:
#1: first_5 (previously #1)
#2: first_1 (previously #4)
#3: first_6 (previously #2)
#4: first_3 (previously #5)
#5: first_2 (previously #6)
#6: first_7 (previously #3)
#7: first_4 (previously #7)
因此,我在尝试优化一个功能时找到了此页面,该功能用于获取已知长度为 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
解决方案 6:
该dict
类型是无序映射,因此不存在“第一个”元素。
你想要的可能是collections.OrderedDict
。
解决方案 7:
答案很简单,我认为是
first = list(prices)[0]
将字典转换为列表将输出键,然后我们将从列表中选择第一个键。
解决方案 8:
假设您想打印第一个键:
print(list(prices.keys())[0])
如果你想打印第一个键的值:
print(prices[list(prices.keys())[0]])
解决方案 9:
正如许多人指出的那样,字典中没有第一个值。字典中的排序是任意的,您不能指望每次访问字典时排序都相同。但是,如果您想打印键,有几种方法可以做到:
for key, value in prices.items():
print(key)
此方法使用元组赋值来访问键和值。如果您出于某种原因需要同时访问键和值,则此方法非常方便。
for key in prices.keys():
print(key)
这将仅允许访问方法所暗示的密钥keys()
。
解决方案 10:
使用 for 循环遍历所有键prices
:
for key, value in prices.items():
print(key)
print("price: %s" % value)
如果你使用的是 Python 2.x,请确保更改prices.items()
为prices.iteritems()
解决方案 11:
d.keys()[0] 获取单个密钥。
更新:-@AlejoBernardin,不确定你为什么说它不起作用。在这里我检查了一下,它起作用了。导入集合
prices = collections.OrderedDict((
("banana", 4),
("apple", 2),
("orange", 1.5),
("pear", 3),
))
prices.keys()[0]
'香蕉'
解决方案 12:
Python 版本 >= 3.7 # 字典是有序的
prices = {
"banana" : 4,
"apple" : 2,
"orange" : 1.5,
"pear" : 3
}
# you can create a list of keys using list(prices.keys())
prices_keys_list = list(prices.keys())
# now you can access the first key of this list
print(prices_keys_list[0]) # remember 0 is the first index
# you can also do the same for values using list(prices.values())
prices_values_list = list(prices.values())
print(prices_values_list[0])
解决方案 13:
正如 @mavix 在另一篇文章的评论中提到的:
在python3中,
dict.keys()
返回的'dict_keys' object
是 而不是list
,不支持索引Blockquote
解决此问题的一个方法是通过迭代将该对象转换为列表。这不是最优雅的解决方案,如果可以避免,实际上不应该使用。
first_key = [key for key in prices.keys()][0]
# ^Converts keys into a list ^Takes the first key from the list
扫码咨询,免费领取项目管理大礼包!