如何在 Python 中将字典键作为列表返回?

2024-12-25 08:51:00
admin
原创
136
摘要:问题描述:使用 Python 2.7,我可以获取字典中的键、值或项作为list:>>> newdict = {1:0, 2:0, 3:0} >>> newdict.keys() [1, 2, 3] 使用 Python >= 3.3,我得到:>>> n...

问题描述:

使用 Python 2.7,我可以获取字典中的作为list

>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]

使用 Python >= 3.3,我得到:

>>> newdict.keys()
dict_keys([1, 2, 3])

如何list使用 Python 3 获取密钥?


解决方案 1:

这会将dict_keys对象转换为list

list(newdict.keys())

另一方面,你应该问问自己这是否重要。假设鸭子类型是 Pythonic 的——如果它看起来像一只鸭子,并且它嘎嘎叫得像一只鸭子,那么它就是一只鸭子。该dict_keys对象可以像 一样进行迭代list。例如:

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

请注意,dict_keys不支持插入newdict[k] = v,尽管您可能不需要它。

解决方案 2:

Python >= 3.5 替代方案:解包成列表文字 [*newdict]

Python 3.5 引入了新的解包泛化(PEP 448),现在您可以轻松执行以下操作:

>>> newdict = {1:0, 2:0, 3:0}
>>> [*newdict]
[1, 2, 3]

解包适用*任何可迭代的对象,并且由于字典在迭代时返回其键,因此您可以通过在列表文字中使用它轻松地创建列表。

添加.keys()ie[*newdict.keys()]可能有助于使您的意图更加明确,尽管这会花费您一个函数查找和调用。(老实说,这不是您真正应该担心的事情)。

语法*iterable类似于 doing list(iterable),其行为最初记录在Python 参考手册的调用部分*iterable。PEP 448放宽了对出现位置的限制,允许将其放置在列表、集合和元组文字中,表达式列表的参考手册也进行了更新以说明这一点。


虽然相当于,list(newdict)但不同之处在于它更快(至少对于小型字典而言),因为实际上没有执行函数调用:

%timeit [*newdict]
1000000 loops, best of 3: 249 ns per loop

%timeit list(newdict)
1000000 loops, best of 3: 508 ns per loop

%timeit [k for k in newdict]
1000000 loops, best of 3: 574 ns per loop

对于较大的字典,速度几乎相同(遍历大型集合的开销超过了函数调用的小成本)。


以类似的方式,您可以创建元组和字典键集:

>>> *newdict,
(1, 2, 3)
>>> {*newdict}
{1, 2, 3}

注意元组末尾的逗号!

解决方案 3:

list(newdict)在 Python 2 和 Python 3 中都可以使用,不需要在newdict.中提供简单的键列表。keys()

解决方案 4:

您还可以使用列表推导

>>> newdict = {1:0, 2:0, 3:0}
>>> [k  for  k in  newdict.keys()]
[1, 2, 3]

或者更短一点,

>>> [k  for  k in  newdict]
[1, 2, 3]

注意:3.7 以下版本不保证顺序(顺序仍然只是 CPython 3.6 的一个实现细节)。

解决方案 5:

“鸭子类型”定义有点偏离——dict.keys()返回一个可迭代对象,而不是类似列表的对象。它可以在可迭代对象可以工作的任何地方工作——而不是列表可以工作的任何地方。列表也是可迭代的,但可迭代不是列表(或序列……)

在实际用例中,对字典中的键执行的最常见操作是迭代它们,因此这很有意义。如果您确实需要它们作为列表,则可以调用list()

非常相似zip()——在绝大多数情况下,它是经过迭代的——为什么要创建一个全新的元组列表只是为了迭代它然后再次将其扔掉?

这是 Python 中一个大趋势的一部分,即使用更多的迭代器(和生成器),而不是到处复制列表。

dict.keys()但是应该与理解一起工作 - 仔细检查拼写错误或其他问题......它对我来说很好用:

>>> d = dict(zip(['Sounder V Depth, F', 'Vessel Latitude, Degrees-Minutes'], [None, None]))
>>> [key.split(", ") for key in d.keys()]
[['Sounder V Depth', 'F'], ['Vessel Latitude', 'Degrees-Minutes']]

解决方案 6:

如果您需要单独存储密钥,这里有一个解决方案,它需要的输入比迄今为止提出的所有其他解决方案都要少,使用扩展可迭代解包(Python3.x+):

newdict = {1: 0, 2: 0, 3: 0}
*k, = newdict

k
# [1, 2, 3]

手术字符数
k = list(d)9 个字符(不包括空格)
k = [*d]6 个字符
*k, = d5 个字符

解决方案 7:

不使用此方法转换为列表keys可以使其更具可读性:

list(newdict)

并且,循环遍历字典时,不需要keys()

for key in newdict:
    print key

除非您在循环内对其进行修改,这将需要预先创建的键列表:

for key in list(newdict):
    del newdict[key]

在 Python 2 上,使用 可以获得轻微的性能提升keys()

解决方案 8:

是的,在 python3.X 中有更好、最简单的方法可以做到这一点


使用内置 list() 函数

#Devil
newdict = {1:0, 2:0, 3:0}
key_list = list(newdict)
print(key_list) 
#[1, 2, 3] 

解决方案 9:

我能想到两种从字典中提取键的方法。

方法 1: -
使用 .keys() 方法获取键,然后将其转换为列表。

some_dict = {1: 'one', 2: 'two', 3: 'three'}
list_of_keys = list(some_dict.keys())
print(list_of_keys)
-->[1,2,3]

方法 2:-
创建一个空列表,然后通过循环将键附加到列表中。您也可以使用此循环获取值(仅使用 .keys() 获取键,使用 .items() 获取键和值)

list_of_keys = []
list_of_values = []
for key,val in some_dict.items():
    list_of_keys.append(key)
    list_of_values.append(val)

print(list_of_keys)
-->[1,2,3]

print(list_of_values)
-->['one','two','three']

解决方案 10:

除了经典的(可能更正确的)方法(some_dict.keys())之外,还有一种更“酷”且更有趣的方法:

some_dict = { "foo": "bar", "cool": "python!" }
print( [*some_dict] == ["foo", "cool"] )         # True  

注意:此解决方案不应在开发环境中使用;我在这里展示它只是因为我认为从*-operator-over-dictionary 的角度来看它非常有趣。另外,我不确定这是否是一个记录在案的功能,并且它的行为可能会在以后的版本中发生变化 :)

解决方案 11:

这是在一行代码中获取键列表的最佳方法

dict_variable = {1:"a",2:"b",3:"c"}  
[key_val for key_val in dict_variable.keys()]

解决方案 12:

获取具有特定值的键列表

您可以选择满足特定条件的键子集。例如,如果您要选择相应值不为 None 的键列表,则使用

[k for k,v in newdict.items() if v is not None]
对字典中的键列表进行切片

从 Python 3.7 开始,字典保留插入顺序。因此, 的一个用例list(newdict)可能是通过索引从字典中选择键或对其进行切片(不是“应该”如何使用它,但肯定是一个可能的问题)。不要转换为列表,islice而是使用内置itertools模块,这样效率更高,因为将键转换为列表只是为了扔掉其中的大部分,这是非常浪费的。例如,要选择 中的第二个键newdict

from itertools import islice
next(islice(newdict, 1, 2))

或者切分第二至第五个键:

list(islice(newdict, 1, 6))

list(newdict)[1]对于大型字典,它比etc.快数千倍。

解决方案 13:

您可以使用如下简单的方法

keys = newdict.keys()
print(keys)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2545  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1551  
  建筑工程全生命周期涉及从项目规划、设计、施工到运营维护等多个复杂阶段,每个阶段都产生和依赖大量信息。PLM(产品生命周期管理)系统作为一种整合数据、流程和人员的数字化解决方案,正逐渐成为建筑行业实现高效协同与可持续发展的关键支撑。通过数字化转型,PLM系统能够优化各阶段的工作流程,提升项目整体质量和效率,为建筑工程的全...
plm是什么软件   1  
  产品生命周期管理(PLM)系统在企业资源成本率优化方面发挥着至关重要的作用。通过构建有效的数据模型,PLM系统能够整合企业各个环节的数据,为资源成本的精准分析和优化提供有力支持。这不仅有助于企业降低成本,还能提升产品质量和市场竞争力。PLM系统概述PLM系统是一种用于管理产品从概念设计到退役全生命周期过程中所有信息和流...
PLM项目管理软件   1  
  产品生命周期管理(PLM)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它整合了从产品概念设计到产品退役的全生命周期数据与流程,助力企业提升效率、降低成本并增强创新能力。随着技术的不断发展,到 2025 年,PLM 系统将具备一系列核心功能模块,这些模块将深度影响企业的运营与发展。产品数据管理模块产品...
plm是什么意思   0  
热门文章
项目管理软件有哪些?
曾咪二维码

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

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

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用