将 [key1,val1,key2,val2] 转换为字典?

2024-12-16 08:35:00
admin
原创
84
摘要:问题描述:假设我a在 Python 中有一个列表,其条目可以方便地映射到字典。每个偶数元素代表字典的键,后面的奇数元素是值例如,a = ['hello','world','1','2'] 我想把它转换成字典b,其中b['hello'] = 'world' b['1'] = '2' 实现此目的最语法清晰的方法是...

问题描述:

假设我a在 Python 中有一个列表,其条目可以方便地映射到字典。每个偶数元素代表字典的键,后面的奇数元素是值

例如,

a = ['hello','world','1','2']

我想把它转换成字典b,其中

b['hello'] = 'world'
b['1'] = '2'

实现此目的最语法清晰的方法是什么?


解决方案 1:

b = dict(zip(a[::2], a[1::2]))

如果a很大,您可能需要执行类似以下的操作,而不会创建任何类似上述的临时列表。

from itertools import izip
i = iter(a)
b = dict(izip(i, i))

在 Python 3 中你也可以使用字典推导,但具有讽刺意味的是,我认为最简单的方法是使用range()and len(),这通常会成为代码异味。

b = {a[i]: a[i+1] for i in range(0, len(a), 2)}

因此该iter()/izip()方法在 Python 3 中可能仍是最具 Python 特色的方法,尽管 EOL 在评论中指出,zip()该方法在 Python 3 中已经是惰性的,所以你不需要izip()

i = iter(a)
b = dict(zip(i, i))

在 Python 3.8 及更高版本中,你可以使用“海象”运算符 () 在一行中编写此代码:=

b = dict(zip(i := iter(a), i))

否则,您需要使用分号将其放在一行上。

解决方案 2:

另一种选择(由Alex Martelli提供-来源):

dict(a[i:i+2] for i in range(0, len(a), 2))

解决方案 3:

您可以轻松使用字典理解来实现这一点:

a = ['hello','world','1','2']

my_dict = {item : a[index+1] for index, item in enumerate(a) if index % 2 == 0}

这相当于下面的 for 循环:

my_dict = {}
for index, item in enumerate(a):
    if index % 2 == 0:
        my_dict[item] = a[index+1]

解决方案 4:

我发现一件很酷的事情,那就是如果你的列表只有 2 个项目:

ls = ['a', 'b']
dict([ls])
>>> {'a':'b'}

请记住,dict 接受任何包含可迭代对象的可迭代对象,其中可迭代对象中的每个项目本身必须是一个具有两个对象的可迭代对象。

解决方案 5:

也许不是最 Python 的,但是

>>> b = {}
>>> for i in range(0, len(a), 2):
        b[a[i]] = a[i+1]

解决方案 6:

无需创建额外的数组就可以快速完成此操作,因此即使对于非常大的数组也可以工作:

dict(izip(*([iter(a)]*2)))

如果你有一个发电机a,那就更好了:

dict(izip(*([a]*2)))

以下是概要:

iter(h)    #create an iterator from the array, no copies here
[]*2       #creates an array with two copies of the same iterator, the trick
izip(*())  #consumes the two iterators creating a tuple
dict()     #puts the tuples into key,value of the dictionary

解决方案 7:

您也可以这样做(在这里将字符串转换为列表,然后转换为字典)

    string_list = """
    Hello World
    Goodbye Night
    Great Day
    Final Sunset
    """.split()

    string_list = dict(zip(string_list[::2],string_list[1::2]))

    print string_list

解决方案 8:

我对这种转换的单行代码也很感兴趣,因为这样的列表是 Perl 中散列的默认初始化程序。

这个帖子给出了非常全面的答案 -

  • python 将列表转换为字典

我是 Python 新手),使用Python 2.7 生成器表达式,将是:

dict((a[i], a[i + 1]) for i in range(0, len(a) - 1, 2))

解决方案 9:

我不确定这是否符合 Python 风格,但似乎可行

def alternate_list(a):
   return a[::2], a[1::2]

key_list,value_list = alternate_list(a)
b = dict(zip(key_list,value_list))

解决方案 10:

尝试下面的代码:

  >>> d2 = dict([('one',1), ('two', 2), ('three', 3)])
  >>> d2
      {'three': 3, 'two': 2, 'one': 1}

解决方案 11:

您还可以尝试这种方法将键和值保存在不同的列表中,然后使用 dict 方法

data=['test1', '1', 'test2', '2', 'test3', '3', 'test4', '4']

keys=[]
values=[]
for i,j in enumerate(data):
    if i%2==0:
        keys.append(j)
    else:
        values.append(j)

print(dict(zip(keys,values)))

输出:

{'test3': '3', 'test1': '1', 'test2': '2', 'test4': '4'}

解决方案 12:

{x: a[a.index(x)+1] for x in a if a.index(x) % 2 ==0}

result : {'hello': 'world', '1': '2'}

解决方案 13:

Python 3.12 引入了该itertools.batched函数。利用该函数,您可以以 2 个为一批迭代原始列表,从而可以执行如下操作:

import itertools

b = dict(itertools.batched(a, 2))
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   990  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   26  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   27  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   26  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   53  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用