将 [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'
实现此目的最语法清晰的方法是什么?
解决方案 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))
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件