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

2024-12-16 08:35:00
admin
原创
160
摘要:问题描述:假设我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))
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用