我有一个格式为{0: [2.0,1.0], 1: [4.0,3.0], 2 [6.0,5.0]}
的字典。如何有效地将其转换为{0: '2.0/1.0', 1: '4.0/3.0', 2 '6.0/5.0'}
(即不使用for循环),以便将每个列表中的数字转换为其比例的字符串。谢谢!
答案 0 :(得分:4)
您可以尝试使用toolz.dicttoolz
from toolz.dicttoolz import valmap
dc={0: [2.0,1.0], 1: [4.0,3.0], 2:[6.0,5.0]}
newdc=valmap(lambda x: f'{x[0]}/{x[1]}', dc)
print(newdc)
在此处查看有关valmap
的有用信息:link1,link2。您也可以尝试使用字典理解:
newdc={k: f"{x[0]}/{x[1]}" for k,x in dc.items()}
print(newdc)
两个输出:
{0: '2.0/1.0', 1: '4.0/3.0', 2: '6.0/5.0'}
时间:
from toolz.dicttoolz import valmap
dc={i:[2.0,1.0] for i in range(100000)}
#Option 1#####
newdc=valmap(lambda x: f'{x[0]}/{x[1]}', dc)
#Option 2#####
newdc={}
for k,x in dc.items():
newdc.update({k:f'{x[0]}/{x[1]}'})
#Option 3#####
newdc={k: f"{x[0]}/{x[1]}" for k,x in dc.items()}
运行10次脚本并计时您将获得的选项:
0.7421236000000135
0.7514457999996011
0.602290400000129
因此valmap
减少了时间,但不如理解词典那么重要。
修改:
经过讨论和对user120242的大量测试,我们得出的结论是,制作理解词典可能是解决问题的最佳方法。如果您有兴趣,请参阅user120242。若要查看https://pastebin.com/Zeyb28Ny用来分析时序的代码以及各种可能的解决方案,请参见此。
答案 1 :(得分:2)
似乎更容易理解列表,如果前两个始终是好的,则可以通过索引访问值
d = {0: [2.0,1.0], 1: [4.0,3.0], 2: [6.0,5.0]}
res = {k: f"{val[0]}/{val[1]}" for k,val in d.items()}
答案 2 :(得分:1)
您可以使用比for循环更快的dict理解。
d = {0: [2.0, 1.0], 1: [4.0, 3.0], 2: [6.0, 5.0]}
d = {key: f"{value[0]}/{value[1]}" for (key, value) in d.items()}
print(d)
>>> {0: "2.0/1.0", 1: "4.0"/3.0", 2: "6.0/5.0"}
话虽如此,如果您的词典只有少量条目,您就不必担心性能。
您可以通过写入"f{value[0]: .1f}/{value[1]: .1f}"
将显示的精度指定为小数点后一位。
答案 3 :(得分:0)
d1={1:12,2:34,3:45} #let this d1 be dict
for i in d1.keys:
print(str(i),end="")