如何找到字典中的第一个键?(python)

2025-03-18 08:54:00
admin
原创
51
摘要:问题描述:我正在尝试让我的程序打印出"banana"字典。最简单的方法是什么?这是我的字典:prices = { "banana" : 4, "apple" : 2, "orange" : 1.5, ...

问题描述:

我正在尝试让我的程序打印出"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

同样适用于值,通过将pricesprices.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
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用